看圖說話:學習Linux內核(1)-ver-1.0.ppt_第1頁
看圖說話:學習Linux內核(1)-ver-1.0.ppt_第2頁
看圖說話:學習Linux內核(1)-ver-1.0.ppt_第3頁
看圖說話:學習Linux內核(1)-ver-1.0.ppt_第4頁
看圖說話:學習Linux內核(1)-ver-1.0.ppt_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、看圖說話:學習Linux內核(1)-ver1.0 以內存管理為線索,騰訊研究院/北京分院/無線組 周曉波(xiaobozhou) 2010-03-29,提綱,前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧 總結,前言,內核 操作系統(tǒng) 內核:管理硬件資源,提供進程運行環(huán)境 設備管理 進程管理 內存管理 文件管理 操作系統(tǒng):內核+系統(tǒng)軟件+其他常用軟件 核心進程 編輯器 交互界面等,前言(cont.1),操作

2、系統(tǒng)(內核)的講法 內存管理 系統(tǒng)調用 中斷處理 內核同步 I/O管理 文件系統(tǒng). 我們 以內存管理為線索,把部分幾個串起來,提綱,前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧 總結,概述,約定 用Linux表示使用Linux內核的操作系統(tǒng),即發(fā)行版本,如Debian 用Linux內核來表達一個內核 Linux發(fā)展簡史 Linux是一個UNIX-like操作系統(tǒng)內核 UNIX是個商標,被Open Gro

3、up擁有 UNIX用來表達符合Unix標準的操作系統(tǒng) 被Open Group的“Single UNIX Specification”認證通過才可使用UNIX商標,否則被稱為UNIX-like系統(tǒng) Linux發(fā)展的三條線索 UNIX的發(fā)展 GNU的發(fā)展 Linux內核的出現,概述(cont.1),Linux發(fā)展的三條線索 UNIX的發(fā)展 世界上沒有一個操作系統(tǒng)叫UNIX白馬非馬 1969年,Ken Thompson和Dennis Ritchie在AT&T貝爾實驗室實現了UnixMultics涅磐 1973年,用C語言重寫Unix飛速發(fā)展 AT&T以分發(fā)許可證的方式,把Unix分發(fā)給大學和研究機構

4、,及至Unix第六版,AT&T意識到商業(yè)價值,成立USL,并宣布對Unix所有權開放到封閉 同時伯克利成立CSRG,開發(fā)并發(fā)布BSD UnixTcp/IP AT&T引入BSD的一些優(yōu)點,發(fā)布Unix System V它和BSD成為現代UNIX的兩個分支 很多公司基于這兩個分支發(fā)布自己的系統(tǒng)Solaris,HP-UX,AIX等商業(yè)版本繁榮 POSIX標準化,概述(cont.2),Linux發(fā)展的三條線索 GNU的發(fā)展 UNIX并不是免費的,其軟件也不是開源的 Richard Stallman在1983年發(fā)起開源軟件項目,為了構建一個免費的操作系統(tǒng):包括編輯器、編譯器、文本處理和內核等 很多UNI

5、X上的軟件都被重寫,并以GPL發(fā)布 Emacs和GCC是旗艦項目,概述(cont.3),Linux發(fā)展的三條線索 Linux內核出現 GNU已經完成了對幾乎全部UNIX的軟件的重寫,除了內核 GNU的內核項目Hurd,進展緩慢 1991年,Linus Torvalds在一個教學的UNIX-like的操作系統(tǒng)Minix基礎上開發(fā)了Linux內核,并以GPL發(fā)布 Linux內核實現了Posix標準,能很好的和GNU軟件配合,成為了GNU系統(tǒng)的內核 Linux內核飛速發(fā)展,很多公司利用GNU軟件+Linux內核發(fā)布自己的操作系統(tǒng),例如RedHat、Debian、FedoraCore和Gentoo等,

6、這些系統(tǒng)被稱為GNU/Linux系統(tǒng),一般就直接叫做Linux,概述(cont.4),UNIX及UNIX-like系統(tǒng)的族譜,概述(cont.5),Linux內核簡介 特點 實現Posix標準,BSD和System V擇優(yōu)實現 單內核 模塊動態(tài)加載 支持進程搶占和內核搶占 獨特的線程實現方式 有限的支持內核線程 面向對象的設備管理框架 使用GCC編譯 .,提綱,前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷

7、棧 總結,內存管理,概述 一個計算機系統(tǒng)(硬件)包括: 中央處理器 存儲器 外設 存儲器 是一切操作的場地(Arena) 操作系統(tǒng)的操作都必須在一個內存空間中完成 運行進程 中斷處理 系統(tǒng)服務 I/O處理 解析內存管理的思路: 硬件支持和接口 Linux對內核態(tài)虛擬地址的映射 用戶態(tài)虛擬地址的映射,內存管理(cont.1),涉及到的機制 硬件方面:分段/分頁/TLB/Cache 軟件方面:分頁/VMA 8086(16位系統(tǒng))只有分段機制 20bit的物理地址 = 段地址 x 16 + 偏移地址,16bit,0000,16bit,輸入:段地址(在段寄存器里),20bit,20bit,輸出:物理地

8、址進地址線,輸入:偏移地址,內存管理(cont.1),8086(16位系統(tǒng))只有分段機制 總結 通過分段機制把“段地址”和“偏移地址”轉化成物理地址,分段單元,偏移地址,段地址,物理地址,內存管理(cont.2),80 x86的分段/分頁 概述: 通過分段機制把“段選擇符”和“邏輯地址”轉換成“線性地址(也稱虛擬地址)” 通過分頁機制把“虛擬地址”轉換成“物理地址”,分段單元,邏輯地址,段選擇符(給出段地址),線性地址,分頁單元,物理地址,內存管理(cont.3),80 x86的分段/分頁 分段概覽,16bit,輸入:段選擇符(段寄存器),32bit,輸入:邏輯地址,段描述符,內存中:段描述符

9、表,內存的某段,段地址,某字節(jié),32bit,輸出:線性地址,段地址,內存管理(cont.4),80 x86的分段/分頁 分段實現 段描述符表怎么找到? GDTR或LDTR寄存器 由段選擇符的TI比特決定GDTR還是LDTR 段描述符查找過程優(yōu)化 有一個非編程寄存器(8字節(jié)?) 當一個段選擇符被裝入段寄存器時,相應的段描述符就被裝入該非編程寄存器中。 Linux在80 x86平臺上的分段 段基地址都是0 x00000000 線性地址=邏輯地址 四個主要段 用戶代碼段、用戶數據段、內核代碼段和內核數據段 段選擇符中的RPL CPU當前級別CPL:內核態(tài)和用戶段(其實有4個) 段描述符中DPL 該段

10、的級別DPL:當CPL高于DPL時可被訪問,13bit的index,1bit的TI,2bit的RPL,段選擇符,內存管理(cont.5),輸入:段選擇符(段寄存器),32bit,輸入:邏輯地址,段描述符,內存中:段描述符表,內存的某段,段地址,某字節(jié),32bit,輸出:線性地址,段地址,GDTR/LDTR,8,32bit,內存管理(cont.6),80 x86的分段/分頁 分頁概覽 分頁 打白條,拆東墻補西墻 也可能相反 把線性地址(虛擬地址)空間中的某塊和物理地址(物理內存)中的某塊映射起來 利用索引找到基地址 加上偏移量 這種映射是以固定大小(頁)為單位 80 x86是4096,但是支持擴

11、展分頁到4M 其過程是: 先分指標,按需給實物 究其本質: 把虛擬地址空間(指標)的分配和實物(物理內存)的分配解耦 推理: 如果虛擬地址空間對應的不是物理內存呢?,內存管理(cont.7),80 x86中的分段/分頁 分頁實現:硬件?軟件? 硬件支持的常規(guī)分頁方式:2級(注意頁目錄項/頁表項都是4字節(jié),其中20bit用于和偏移量來合成物理地址),10bit頁目錄索引,10bit頁表索引,12bit頁內偏移,由分段機制產生出來的線性地址,頁目錄基地址的物理地址,CR3寄存器,頁目錄項,頁目錄,頁表項,頁表,物理內存頁,某字節(jié),第0bit,第31bit,內存管理(cont.8),80 x86中的

12、分段/分頁 分頁實現 硬件支持的擴展分頁(4M或2M) 注意兼容性的考慮,10bit頁目錄索引,22bit頁表索引,由分段機制產生出來的線性地址,頁目錄基地址的物理地址,CR3寄存器,頁目錄項,頁目錄,物理內存頁4M,某字節(jié),第0bit,第31bit,內存管理(cont.9),80 x86分段/分頁 分頁機制的硬件支持回顧 硬件做了什么?為什么說這是硬件支持的? 多級分頁時,查找頁表的過程是硬件完成的嗎? 這個過程中需要軟件支持嗎? 分頁機制對線性地址的解析是10/10/12,擴展分頁是10/22。能不能是13/10,或者其他?能隨便分配嗎? 拆東墻補西墻的反例是什么?,內存管理(cont.1

13、0),80 x86的分段/分頁 當物理內存大于4G時,如何利用之 80 x86的尋址能力是64G(36bit地址寬度) PAE和PSE,PSE不被Linux支持 原理很簡單,32 36 實現很難: 區(qū)分虛擬地址空間 兼容擴展分頁機制 注意這是硬件層面 因為已經解耦,頁表項存的 基地址+頁內偏移=36即可,內存管理(cont.10),80 x86分段/分頁 PAE的實現,先看常規(guī)分頁的圖:,這里還有 一個變量,10bit頁目錄索引,10bit頁表索引,12bit頁內偏移,由分段機制產生出來的線性地址,頁目錄基地址的物理地址,CR3寄存器,頁目錄項,頁目錄,頁表項,頁表,物理內存頁,某字節(jié),第0b

14、it,第31bit,內存管理(cont.10),80 x86分段/分頁 PAE的實現:增加一級(注意頁表項/頁目錄項是8字節(jié),其中24bit用于和頁內偏移來合成物理地址) CR3每指定一個PDPT就可以尋址4G 如何在程序中使用呢?,2bit PDPT,9bit頁表索引,12bit頁內偏移,由分段機制產生出來的線性地址,PDPT基地址的物理地址,CR3寄存器,頁目錄項,頁目錄,頁表項,頁表,物理內存頁,某字節(jié),第0bit,第31bit,標志是否開啟PAE,CR4寄存器,9bit頁目錄索引,PDPT項,PDPT,內存管理(cont.11),80 x86內存訪問優(yōu)化 TLB和Cache TLB 緩

15、存已經轉換好的對 當CR3的值發(fā)生變化時,所有表項失效,標記,物理地址,0/1,標記,物理地址,0/1,內存管理(cont.12),80 x86內存訪問優(yōu)化 Cache 改善分頁機制 緩存對 直接映射 全關聯(lián)映射 組關聯(lián)映射,標記,某塊內存 (多字節(jié)),標記,標記,內存中的塊和緩存中的塊是多對一,而且不可變。 例如:內存塊映射到內存塊基地址mod緩存的總塊數,直接映射,某塊內存 (多字節(jié)),某塊內存 (多字節(jié)),內存塊號,塊內偏移,函數運算,線性地址,內存管理(cont.13),80 x86內存訪問優(yōu)化 Cache,全關聯(lián)中,緩存中的塊 和物理內存中的塊沒有 函數關系,必須挨個比 較“標記”來

16、檢查緩存中是 有該塊。 硬件可以用一次比較來 實現,但是復雜度高。,標記,某塊內存 (多字節(jié)),標記,標記,全關聯(lián)映射,某塊內存 (多字節(jié)),某塊內存 (多字節(jié)),內存塊號,塊內偏移,比較運算,線性地址,內存管理(cont.14),80 x86內存訪問優(yōu)化 Cache,組關聯(lián)中 物理內存和緩存都被分成N組, 第k組的內存塊被映射到緩存 第k組。 第k組中的第i塊被映射到緩存 第k組的任意一塊(無函數關 系),而且顯然內存第k組的 塊數遠大于緩存第k組的塊數。,標記,某塊內存 (多字節(jié)),標記,標記,組關聯(lián)映射,某塊內存 (多字節(jié)),某塊內存 (多字節(jié)),內存塊號,塊內偏移,比較運算,線性地址,

17、標記,某塊內存 (多字節(jié)),標記,某塊內存 (多字節(jié)),組號,內存管理(cont.15),Linux內核對分頁的實現 數據結構實現了四級,用一套代碼實現多種場景 常規(guī)分頁需2級,擴展分頁需1級,PAE需3級,PAE且擴展分頁需2級,x86_64需4級,頁全局目錄,頁上級目錄,頁中級目錄,頁表,偏移,頁全局目錄基地址物理地址,CR3寄存器,頁全局目錄,頁上級目錄,頁中級目錄,頁目錄,頁,內存管理(cont.16),內存管理總結 實模式 vs 保護模式 實模式下分段 保護模式下的分段 保護模式下的分頁 TLB結構 擴展分頁機制 PAE機制 Cache結構 Linux內核的實現 代碼復用 軟件(內核

18、或用戶軟件)訪問內存的方式 給出段選擇符/邏輯地址 也就是說,不能直接用物理地址 只有實模式可以直接用物理地址 理解和區(qū)分硬件軟件所做的工作,內存管理(cont.17),物理內存布局 以頁框為單位(物理頁叫頁框Page Frame,線性地址空間中的頁就叫頁Page) 并不是所有物理內存(地址空間)都可以被使用 下表是一個128MB內存的機器啟動時BIOS上報的物理地址布局,64位機器32位Linux啟動時BIOS上報的物理內存信息,64位Linux啟動時BIOS上報的物理內存信息,32位機器32位Linux啟動時BIOS上報的物理內存信息,沒有找到32位機器 -_-b,內存管理(cont.18

19、),虛擬地址空間到物理地址空間的總體映射關系 分三個區(qū) ZONE_DMA(ZONE_DMA32) x86只能用物理地址016M,不是說這16M只能用于DMA 有些體系結構可以用所有物理內存 ZONE_HIGHMEM x86上大于896M的物理地址空間 如果物理地址少于896M則無需highmem 這個區(qū)的物理地址可以動態(tài)映射到虛擬地址空間 需要時映射,且映射沒有函數關系 ZONE_NORMAL 剩下的都是ZONE_NORMAL 這些物理地址可以被虛擬地址直接映射 虛擬地址減去3G(PAGE_OFFSET宏)即可 物理內存大于1G時,由于內核虛擬地址空間只有1G,直接映射方式導致內核無法使用大于

20、1G的物理內存,因此需要動態(tài)映射。 這個區(qū)的物理地址也可以被動態(tài)映射給用戶態(tài)(內核態(tài)呢?),即直接映射是一種優(yōu)化,不是說這段物理地址就被預留。 映射平衡:平衡三個區(qū)的物理內存使用,主要是normal和heighmem,問題:normal區(qū)的物理地址如果被映射給用戶空間虛擬地址了,內核要用的時候怎么辦?,內存管理(cont.19),物理內存的分區(qū) 內核用幾個變量來描述物理內存布局 num_physpages totalram_pages max_pfn min_low_pfn max_low_pfn totalhigh_pages highstart_pfn heighend_pfn,0 x00

21、000000,0 xXXXXXXXX,0 x00000000,0 xXXXXXXXX,ZONE_NORMAL 和ZONE_DMA,ZONE_HIGHMEM,ZONE_NORMAL 和ZONE_DMA,提綱,前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧 總結,進程地址空間分布,概述 進程地址空間 內核空間(進程在內核態(tài)時可訪問) 用戶空間(進程在內核態(tài)和用戶態(tài)都可訪問) 地址空間的劃分 通過分頁機制來讓每

22、個進程都有一個全虛擬地址空間 段選擇符來標識Ring0-3 從進程頁表和內核頁表說起 頁全局目錄 每個進程的頁全局目錄的前一部分是用戶空間的 后一部分都是相同的,是內核空間 各進程的內核空間完全相同嗎?內核棧呢?完全相同 內核空間有一部分不是永久映射,不同的進程映射到不同物理內存,U區(qū) 內核頁全局目錄 從未被使用 是頁全局目錄的后半部分的模板,進程地址空間分布(cont.1),頁全局目錄,頁上級目錄,頁中級目錄,頁表,偏移,頁全局目錄基地址物理地址,CR3寄存器,頁全局目錄,頁上級目錄,頁中級目錄,頁目錄,頁,內核頁全局目錄,不同進程有不同的頁全局目錄;但是下部分是相同的。,進程地址空間分布(

23、cont.2),頁表結構 永久映射 vs 臨時映射 永久映射是線性地址和物理地址固定映射,物理頁框不會被換出(swap)到硬盤 臨時映射是分配“指標”和分配“實物(即物理內存)”兩步走,利用缺頁異常來實現分配“實物” 進程線性地址空間可分為: 用戶態(tài)動態(tài)映射地址 內核態(tài)直接映射地址 內核態(tài)動態(tài)映射地址 先看虛擬地址空間和物理地址空間的映射的總體情況,進程地址空間分布(cont.3),0 x00000000,0 xFFFFFFFF,進程的線性地址空間,0 xC0000000,0 x00000000,x86體系物理內存,0 xFFFFFFFF,0 x01000000,016M用于DMA ZONE_

24、DMA,0 x38000000,16896M為 ZONE_NORMAL,896M以上為 ZONE_HIGHMEM,內核空間,high_memory標識了 動態(tài)映射的起始點第一 個(不對)物理地址 直接映射后的虛擬地址,物理內存1G時的線性地址和物理地址總體映射,進程地址空間分布(cont.4),0 x00000000,0 xFFFFFFFF,進程的線性地址空間,0 xC0000000,0 x00000000,x86體系物理內存,0 xXXXXXXXX896M,0 x01000000,DMA只能從這里取 016M 稱為ZONE_DMA,ZONE_NORMAL,內核空間,high_memory標識

25、了 動態(tài)映射的起始點,就 是第896M字節(jié)物理地址 直接映射后的虛擬地址,物理內存1G時的線性地址和物理地址總體映射,進程地址空間分布(cont.5),進程地址空間布局 前面介紹了 物理內存的布局 虛擬地址空間和物理地址空間的大體映射規(guī)則(即分區(qū)) 現在需要 細化虛擬地址空間的布局 如何實現這種布局,進程地址空間分布(cont.6),虛擬地址空間的劃分 用戶空間 03G 內核空間 3G4G 虛擬地址空間的維護 每個進程對象(struct task_struct結構)有一個內存描述符(struct mm_struct結構),全權維護該進程的虛擬地址空間 內存描述符通過一個VMA鏈表(及紅黑樹)實

26、現對虛擬地址空間的維護,struct task_struct,mm,struct mm_struct,mm_map,struct vm_area_struct,vm_start,vm_end,vm_file,vm_ops,struct vm_area_struct,vm_start,vm_end,虛擬地址03G,文件描述符,進程地址空間分布(cont.7),VMA 為什么要VMA 3G空間太大,需要分段維護 3G空間不是被順序使用的 和可執(zhí)行文件的結構有關 和可執(zhí)行文件的加載過程有關 解耦虛擬地址空間的使用(可以認為加入VMA層),VMA層,操作某個虛擬地址,分段/TLB,頁表/Cache,物

27、理內存,進程地址空間分布(cont.8),1,可執(zhí)行文件映像 2,libc映像 3,棧段/堆段(segment不是section) 4,vdso內核提供的虛擬動態(tài)庫(注意其地址),內核,棧VMA,堆VMA,數據段VMA,代碼段VMA,堆VMA,數據段VMA,代碼段VMA,進程地址空間分布(cont.9),常見的VMA 可執(zhí)行文件和動態(tài)庫映像 代碼段/數據段/BSS(BSS可能合并到數據段了) 不必把所有的內容都讀入,需要時用缺頁異常 加快程序加載速度 棧和堆 便于控制棧的大小、位置等 只有一個堆 windows有多個堆,所以windows可以malloc的最大內存較小 共享內存 多個進程之間共

28、享同樣的物理內存區(qū) 內存映射文件 把一段虛擬地址映射到文件,便于在進程退出時保留,進程地址空間分布(cont.10),總結 物理地址空間的分區(qū)(ZONE) 虛擬地址空間用戶態(tài)和內核態(tài)之分 虛擬地址空間的分區(qū)(VMA),提綱,前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧 總結,內核態(tài)虛擬地址空間,內核相關概念 中斷 異常/中斷 軟件中斷/陷入 軟中斷 BH BH 任務隊列(task queue) 軟中斷

29、tasklet(基于軟中斷) ksoftirqd 工作隊列(work queue),內核態(tài)虛擬地址空間(cont.1),內核相關概念 搶占 概念 搶占就是強制對可調度實體進行上下文切換 理解 必須是可調度的實體 必須有上下文切換動作 中斷 vs 搶占,內核態(tài)虛擬地址空間(cont.2),內核相關概念 搶占 用戶態(tài)搶占 就是進程調度,由schedule()函數實現 時機 從系統(tǒng)調用返回用戶空間 從中斷處理程序返回用戶空間(顯然,時鐘中斷也是) 內核態(tài)搶占 本質上說,也是進程調度 內核鎖是不可搶占區(qū)域的標識 時機 從中斷處理程序返回之際 內核任務調用schedule(顯示調用或者阻塞) 不可搶占 中斷例程 可嵌套,不可搶占 因為它不是調度對象,內核態(tài)虛擬地址空間(cont.3),CPU工作在三種狀態(tài) 在用戶態(tài)執(zhí)行某個進程 在內核態(tài)下執(zhí)行某個進程 執(zhí)行中斷例程 上下文(context) CPU必定在某個上下文中執(zhí)行 進程的用戶級上下文 進程的內核級上下文 中斷上下文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論