版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、看圖說話:學習Linux內核(1)-ver1.0 以內存管理為線索騰訊研究院/北京分院/無線組周曉波(xiaobozhou)2010-03-29提綱 前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷??偨Y前言 內核 操作系統 內核:管理硬件資源,提供進程運行環(huán)境 設備管理 進程管理 內存管理 文件管理 操作系統:內核+系統軟件+其他常用軟件 核心進程 編輯器 交互界面等前言(cont.1) 操作系統(內核)的
2、講法 內存管理 系統調用 中斷處理 內核同步 I/O管理 文件系統. 我們 以內存管理為線索,把部分幾個串起來提綱 前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧總結概述 約定 用Linux表示使用Linux內核的操作系統,即發(fā)行版本,如Debian 用Linux內核來表達一個內核 Linux發(fā)展簡史 Linux是一個UNIX-like操作系統內核 UNIX是個商標,被Open Group擁有 UNIX用
3、來表達符合Unix標準的操作系統 被Open Group的“Single UNIX Specification”認證通過才可使用UNIX商標,否則被稱為UNIX-like系統 Linux發(fā)展的三條線索 UNIX的發(fā)展 GNU的發(fā)展 Linux內核的出現概述(cont.1) Linux發(fā)展的三條線索 UNIX的發(fā)展 世界上沒有一個操作系統叫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ā)布自己的系統Solaris,HP-UX,AIX等商業(yè)版本繁榮 POSIX標準化概述(cont.2) Linux發(fā)展的三條線索 GNU的發(fā)展 UNIX并不是免費的,其軟件也不是開源的 Richard Stallman在1983年發(fā)起開源軟件項目,為了構建一個免費的操作系統:包括編輯器、編譯器、文本處理和內核等 很
5、多UNIX上的軟件都被重寫,并以GPL發(fā)布 Emacs和GCC是旗艦項目概述(cont.3) Linux發(fā)展的三條線索 Linux內核出現 GNU已經完成了對幾乎全部UNIX的軟件的重寫,除了內核 GNU的內核項目Hurd,進展緩慢 1991年,Linus Torvalds在一個教學的UNIX-like的操作系統Minix基礎上開發(fā)了Linux內核,并以GPL發(fā)布 Linux內核實現了Posix標準,能很好的和GNU軟件配合,成為了GNU系統的內核 Linux內核飛速發(fā)展,很多公司利用GNU軟件+Linux內核發(fā)布自己的操作系統,例如RedHat、Debian、FedoraCore和Gento
6、o等,這些系統被稱為GNU/Linux系統,一般就直接叫做Linux概述(cont.4) UNIX及UNIX-like系統的族譜概述(cont.5) Linux內核簡介 特點 實現Posix標準,BSD和System V擇優(yōu)實現 單內核 模塊動態(tài)加載 支持進程搶占和內核搶占 獨特的線程實現方式 有限的支持內核線程 面向對象的設備管理框架 使用GCC編譯 .提綱 前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷
7、棧總結內存管理 概述 一個計算機系統(硬件)包括: 中央處理器 存儲器 外設 存儲器 是一切操作的場地(Arena) 操作系統的操作都必須在一個內存空間中完成 運行進程 中斷處理 系統服務 I/O處理 解析內存管理的思路: 硬件支持和接口 Linux對內核態(tài)虛擬地址的映射 用戶態(tài)虛擬地址的映射內存管理(cont.1)涉及到的機制 硬件方面:分段/分頁/TLB/Cache 軟件方面:分頁/VMA8086(16位系統)只有分段機制 20bit的物理地址 = 段地址 x 16 + 偏移地址16bit000016bit輸入:段地址(在段寄存器里)20bit20bit輸出:物理地址進地址線輸入:偏移地址
8、內存管理(cont.1)8086(16位系統)只有分段機制 總結通過分段機制把“段地址”和“偏移地址”轉化成物理地址分段單元偏移地址段地址物理地址內存管理(cont.2) 80 x86的分段/分頁 概述: 通過分段機制把“段選擇符”和“邏輯地址”轉換成“線性地址(也稱虛擬地址)” 通過分頁機制把“虛擬地址”轉換成“物理地址”分段單元邏輯地址段選擇符(給出段地址)線性地址分頁單元物理地址內存管理(cont.3) 80 x86的分段/分頁 分段概覽16bit輸入:段選擇符(段寄存器)32bit輸入:邏輯地址段描述符內存中:段描述符表內存的某段段地址某字節(jié)32bit輸出:線性地址段地址內存管理(co
9、nt.4) 80 x86的分段/分頁 分段實現 段描述符表怎么找到? GDTR或LDTR寄存器 由段選擇符的TI比特決定GDTR還是LDTR 段描述符查找過程優(yōu)化 有一個非編程寄存器(8字節(jié)?) 當一個段選擇符被裝入段寄存器時,相應的段描述符就被裝入該非編程寄存器中。 Linux在80 x86平臺上的分段 段基地址都是0 x00000000 線性地址=邏輯地址 四個主要段 用戶代碼段、用戶數據段、內核代碼段和內核數據段 段選擇符中的RPL CPU當前級別CPL:內核態(tài)和用戶段(其實有4個) 段描述符中DPL 該段的級別DPL:當CPL高于DPL時可被訪問13bit的index 1bit的TI
10、2bit的RPL段選擇符內存管理(cont.5)輸入:段選擇符(段寄存器)32bit輸入:邏輯地址段描述符內存中:段描述符表內存的某段段地址某字節(jié)32bit輸出:線性地址段地址GDTR/LDTR13bit的index 1bit的TI 2bit的RPL832bit32bit非編程寄存器裝段描述符內存管理(cont.6) 80 x86的分段/分頁 分頁概覽 分頁 打白條,拆東墻補西墻 也可能相反 把線性地址(虛擬地址)空間中的某塊和物理地址(物理內存)中的某塊映射起來 利用索引找到基地址 加上偏移量 這種映射是以固定大?。摚閱挝?80 x86是4096,但是支持擴展分頁到4M 其過程是: 先分
11、指標,按需給實物 究其本質: 把虛擬地址空間(指標)的分配和實物(物理內存)的分配解耦 推理: 如果虛擬地址空間對應的不是物理內存呢?內存管理(cont.7)80 x86中的分段/分頁 分頁實現:硬件?軟件? 硬件支持的常規(guī)分頁方式:2級(注意頁目錄項/頁表項都是4字節(jié),其中20bit用于和偏移量來合成物理地址)10bit頁目錄索引10bit頁表索引12bit頁內偏移由分段機制產生出來的線性地址頁目錄基地址的物理地址CR3寄存器頁目錄項頁目錄頁表項頁表物理內存頁某字節(jié)第0bit第31bit內存管理(cont.8)80 x86中的分段/分頁 分頁實現 硬件支持的擴展分頁(4M或2M) 注意兼容性
12、的考慮10bit頁目錄索引22bit頁表索引由分段機制產生出來的線性地址頁目錄基地址的物理地址CR3寄存器頁目錄項頁目錄物理內存頁4M某字節(jié)第0bit第31bit內存管理(cont.9) 80 x86分段/分頁 分頁機制的硬件支持回顧 硬件做了什么?為什么說這是硬件支持的? 多級分頁時,查找頁表的過程是硬件完成的嗎? 這個過程中需要軟件支持嗎? 分頁機制對線性地址的解析是10/10/12,擴展分頁是10/22。能不能是13/10,或者其他?能隨便分配嗎? 拆東墻補西墻的反例是什么?內存管理(cont.10) 80 x86的分段/分頁 當物理內存大于4G時,如何利用之 80 x86的尋址能力是6
13、4G(36bit地址寬度) PAE和PSE,PSE不被Linux支持 原理很簡單,32 36 實現很難: 區(qū)分虛擬地址空間 兼容擴展分頁機制 注意這是硬件層面 因為已經解耦,頁表項存的 基地址+頁內偏移=36即可內存管理(cont.10) 80 x86分段/分頁 PAE的實現,先看常規(guī)分頁的圖:這里還有一個變量10bit頁目錄索引10bit頁表索引12bit頁內偏移由分段機制產生出來的線性地址頁目錄基地址的物理地址CR3寄存器頁目錄項頁目錄頁表項頁表物理內存頁某字節(jié)第0bit第31bit內存管理(cont.10) 80 x86分段/分頁 PAE的實現:增加一級(注意頁表項/頁目錄項是8字節(jié),其
14、中24bit用于和頁內偏移來合成物理地址) CR3每指定一個PDPT就可以尋址4G 如何在程序中使用呢?2bit PDPT9bit頁表索引 12bit頁內偏移由分段機制產生出來的線性地址PDPT基地址的物理地址CR3寄存器頁目錄項頁目錄頁表項頁表物理內存頁某字節(jié)第0bit第31bit標志是否開啟PAECR4寄存器9bit頁目錄索引PDPT項PDPT內存管理(cont.11) 80 x86內存訪問優(yōu)化 TLB和Cache TLB 緩存已經轉換好的對 當CR3的值發(fā)生變化時,所有表項失效標記物理地址0/1標記物理地址0/1內存管理(cont.12) 80 x86內存訪問優(yōu)化 Cache 改善分頁機
15、制 緩存對 直接映射 全關聯映射 組關聯映射標記某塊內存(多字節(jié))標記標記內存中的塊和緩存中的塊是多對一,而且不可變。例如:內存塊映射到內存塊基地址mod緩存的總塊數直接映射某塊內存(多字節(jié))某塊內存(多字節(jié))內存塊號塊內偏移函數運算線性地址內存管理(cont.13) 80 x86內存訪問優(yōu)化 Cache全關聯中,緩存中的塊和物理內存中的塊沒有函數關系,必須挨個比較“標記”來檢查緩存中是有該塊。硬件可以用一次比較來實現,但是復雜度高。標記某塊內存(多字節(jié))標記標記全關聯映射某塊內存(多字節(jié))某塊內存(多字節(jié))內存塊號塊內偏移比較運算線性地址內存管理(cont.14) 80 x86內存訪問優(yōu)化
16、Cache組關聯中物理內存和緩存都被分成N組,第k組的內存塊被映射到緩存第k組。第k組中的第i塊被映射到緩存第k組的任意一塊(無函數關系),而且顯然內存第k組的塊數遠大于緩存第k組的塊數。標記某塊內存(多字節(jié))標記標記組關聯映射某塊內存(多字節(jié))某塊內存(多字節(jié))內存塊號塊內偏移比較運算線性地址標記某塊內存(多字節(jié))標記某塊內存(多字節(jié))組號內存管理(cont.15)Linux內核對分頁的實現 數據結構實現了四級,用一套代碼實現多種場景 常規(guī)分頁需2級,擴展分頁需1級,PAE需3級,PAE且擴展分頁需2級,x86_64需4級頁全局目錄頁上級目錄頁中級目錄頁表偏移頁全局目錄基地址物理地址CR3寄
17、存器頁全局目錄頁上級目錄頁中級目錄頁目錄頁內存管理(cont.16) 內存管理總結 實模式 vs 保護模式 實模式下分段 保護模式下的分段 保護模式下的分頁 TLB結構 擴展分頁機制 PAE機制 Cache結構 Linux內核的實現 代碼復用 軟件(內核或用戶軟件)訪問內存的方式 給出段選擇符/邏輯地址 也就是說,不能直接用物理地址 只有實模式可以直接用物理地址 理解和區(qū)分硬件軟件所做的工作內存管理(cont.17)物理內存布局 以頁框為單位(物理頁叫頁框Page Frame,線性地址空間中的頁就叫頁Page) 并不是所有物理內存(地址空間)都可以被使用 下表是一個128MB內存的機器啟動時B
18、IOS上報的物理地址布局64位機器32位Linux啟動時BIOS上報的物理內存信息64位Linux啟動時BIOS上報的物理內存信息32位機器32位Linux啟動時BIOS上報的物理內存信息沒有找到32位機器 -_-b內存管理(cont.18)虛擬地址空間到物理地址空間的總體映射關系分三個區(qū)ZONE_DMA(ZONE_DMA32)x86只能用物理地址016M,不是說這16M只能用于DMA有些體系結構可以用所有物理內存ZONE_HIGHMEMx86上大于896M的物理地址空間如果物理地址少于896M則無需highmem這個區(qū)的物理地址可以動態(tài)映射到虛擬地址空間需要時映射,且映射沒有函數關系ZONE
19、_NORMAL剩下的都是ZONE_NORMAL這些物理地址可以被虛擬地址直接映射虛擬地址減去3G(PAGE_OFFSET宏)即可物理內存大于1G時,由于內核虛擬地址空間只有1G,直接映射方式導致內核無法使用大于1G的物理內存,因此需要動態(tài)映射。這個區(qū)的物理地址也可以被動態(tài)映射給用戶態(tài)(內核態(tài)呢?),即直接映射是一種優(yōu)化,不是說這段物理地址就被預留。映射平衡:平衡三個區(qū)的物理內存使用,主要是normal和heighmem問題:normal區(qū)的物理地址如果被映射給用戶空間虛擬地址了,內核要用的時候怎么辦?內存管理(cont.19) 物理內存的分區(qū) 內核用幾個變量來描述物理內存布局 num_phys
20、pages totalram_pages max_pfn min_low_pfn max_low_pfn totalhigh_pages highstart_pfn heighend_pfn0 x000000000 xXXXXXXXX0 x000000000 xXXXXXXXXZONE_NORMAL和ZONE_DMAZONE_HIGHMEMZONE_NORMAL和ZONE_DMA提綱 前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上
21、下文、搶占、內核棧、中斷棧總結進程地址空間分布 概述 進程地址空間 內核空間(進程在內核態(tài)時可訪問) 用戶空間(進程在內核態(tài)和用戶態(tài)都可訪問) 地址空間的劃分 通過分頁機制來讓每個進程都有一個全虛擬地址空間 段選擇符來標識Ring0-3 從進程頁表和內核頁表說起 頁全局目錄 每個進程的頁全局目錄的前一部分是用戶空間的 后一部分都是相同的,是內核空間 各進程的內核空間完全相同嗎?內核棧呢?完全相同 內核空間有一部分不是永久映射,不同的進程映射到不同物理內存,U區(qū) 內核頁全局目錄 從未被使用 是頁全局目錄的后半部分的模板進程地址空間分布(cont.1)頁全局目錄頁上級目錄頁中級目錄頁表偏移頁全局目
22、錄基地址物理地址CR3寄存器頁全局目錄頁上級目錄頁中級目錄頁目錄頁內核頁全局目錄不同進程有不同的頁全局目錄;但是下部分是相同的。進程地址空間分布(cont.2) 頁表結構 永久映射 vs 臨時映射 永久映射是線性地址和物理地址固定映射,物理頁框不會被換出(swap)到硬盤 臨時映射是分配“指標”和分配“實物(即物理內存)”兩步走,利用缺頁異常來實現分配“實物” 進程線性地址空間可分為: 用戶態(tài)動態(tài)映射地址 內核態(tài)直接映射地址 內核態(tài)動態(tài)映射地址 先看虛擬地址空間和物理地址空間的映射的總體情況進程地址空間分布(cont.3)0 x000000000 xFFFFFFFF進程的線性地址空間0 xC0
23、0000000 x00000000 x86體系物理內存0 xFFFFFFFF0 x01000000016M用于DMAZONE_DMA0 x3800000016896M為ZONE_NORMAL896M以上為ZONE_HIGHMEM內核空間high_memory標識了動態(tài)映射的起始點第一個(不對)物理地址直接映射后的虛擬地址物理內存1G時的線性地址和物理地址總體映射進程地址空間分布(cont.4)0 x000000000 xFFFFFFFF進程的線性地址空間0 xC00000000 x00000000 x86體系物理內存0 xXXXXXXXX896M0 x01000000DMA只能從這里取016M
24、稱為ZONE_DMAZONE_NORMAL內核空間high_memory標識了動態(tài)映射的起始點,就是第896M字節(jié)物理地址直接映射后的虛擬地址物理內存1G時的線性地址和物理地址總體映射進程地址空間分布(cont.5) 進程地址空間布局 前面介紹了 物理內存的布局 虛擬地址空間和物理地址空間的大體映射規(guī)則(即分區(qū)) 現在需要 細化虛擬地址空間的布局 如何實現這種布局進程地址空間分布(cont.6) 虛擬地址空間的劃分 用戶空間 03G 內核空間 3G4G 虛擬地址空間的維護 每個進程對象(struct task_struct結構)有一個內存描述符(struct mm_struct結構),全權維護
25、該進程的虛擬地址空間 內存描述符通過一個VMA鏈表(及紅黑樹)實現對虛擬地址空間的維護struct task_structmmstruct mm_structmm_mapstruct vm_area_structvm_startvm_endvm_filevm_opsstruct vm_area_structvm_startvm_end虛擬地址03G文件描述符進程地址空間分布(cont.7) VMA 為什么要VMA 3G空間太大,需要分段維護 3G空間不是被順序使用的 和可執(zhí)行文件的結構有關 和可執(zhí)行文件的加載過程有關 解耦虛擬地址空間的使用(可以認為加入VMA層)VMA層操作某個虛擬地址分段/
26、TLB頁表/Cache物理內存進程地址空間分布(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的最大內存較小 共享內存 多個進程之間共享同
27、樣的物理內存區(qū) 內存映射文件 把一段虛擬地址映射到文件,便于在進程退出時保留進程地址空間分布(cont.10) 總結 物理地址空間的分區(qū)(ZONE) 虛擬地址空間用戶態(tài)和內核態(tài)之分 虛擬地址空間的分區(qū)(VMA)提綱 前言 概述 Linux發(fā)展簡史 Linux內核簡介 內存管理 實模式 保護模式 虛擬地址到物理地址的總體映射關系(分區(qū)) 進程內存空間布局 內核態(tài)虛擬地址空間 異常、中斷、陷入、軟中斷、軟件中斷、底半(BH) 上下文、搶占、內核棧、中斷棧總結內核態(tài)虛擬地址空間 內核相關概念 中斷 異常/中斷 軟件中斷/陷入 軟中斷 BH BH 任務隊列(task queue) 軟中斷 taskle
28、t(基于軟中斷) ksoftirqd 工作隊列(work queue)內核態(tài)虛擬地址空間(cont.1) 內核相關概念 搶占 概念 搶占就是強制對可調度實體進行上下文切換 理解 必須是可調度的實體 必須有上下文切換動作 中斷 vs 搶占內核態(tài)虛擬地址空間(cont.2) 內核相關概念 搶占 用戶態(tài)搶占 就是進程調度,由schedule()函數實現 時機 從系統調用返回用戶空間 從中斷處理程序返回用戶空間(顯然,時鐘中斷也是) 內核態(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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司安全管理人員安全培訓試題及答案高清
- 班組三級安全培訓試題及完整答案(易錯題)
- 數控技術實習總結
- 開班儀式校長講話稿(7篇)
- 涉外交流合作管理制度
- 故宮英文導游詞
- 服務器虛擬化技術方案
- 水族池用泵相關項目實施方案
- 公司IPMT運作制度
- 護士試用期工作總結
- 投標書服裝范文
- 3.6《推動社會發(fā)展的印刷術》課件
- 《百合花》《哦香雪》聯讀+探究詩化特征
- 小學道法二 我自豪 我是中國人課件
- 小學部編版五年級語文上冊教案(全)
- 高中體育與健康-足球變向運球教學課件設計
- 老人租房免責協議書
- 中印邊境自衛(wèi)反擊戰(zhàn)
- 管道試壓方案樣本
- 供電局電網預防雨雪冰凍災害應急預案
- 內在激勵與外在激勵ppt
評論
0/150
提交評論