版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 張惠娟 副教授 Linux內存管理內容 i386存儲管理單元 Linux存儲管理思想 物理內存空間管理 進程虛擬空間管理 請頁機制 交換空間管理 緩沖機制 MMU 分段機制i386的存儲管理單元i386的存儲管理單元 MMU MMU由一個或一組芯片組成,其功能是把虛地址 映射為物理地址,即地址轉換。 80386以兩級方式實現地址轉換: 第一級運用段機制,第二級運用分頁機制。 在80386上,分頁機制是支持虛擬存儲器的最正確選擇。段機制運用可變大小的塊,使段機制較適宜處置復雜系統(tǒng)的邏輯分區(qū)。i386的存儲管理單元 分段機制 段描畫符 描畫了段的基地址、界限
2、及維護屬性,是一個8字 節(jié)的數據構造,存放在段描畫符表中。 i386的存儲管理單元上圖闡明 從圖中可以看出,一個段描畫符指出了段的32位基地址和20位段界限即段長。 第6個字節(jié)的G位是粒度位,當G=0時,段長的表示格式為字節(jié)長度,即一個段最長可達1M字節(jié)。當G=1時,段長表示段以4K字節(jié)為一頁的頁數目,即一個段最長可達1M*4K=4G字節(jié)。 D表示缺省操作數大小,D=0,操作數為16位,假設D=1,操作數為32位。i386的存儲管理單元描畫符表 在分段機制中,系統(tǒng)維護三種段表,稱為描畫符表,即全局描畫符表、部分描畫符表和中斷描畫符表。 描畫符表本身占據的字節(jié)數為8的倍數,空間大小在8個字節(jié)至少
3、含一個描畫符到64K字節(jié)至多含8K個描畫符之間。i386的存儲管理單元全局描畫符表GDT 全局描畫符表包含著系統(tǒng)中一切義務都可用的那些描畫符。部分描畫符表LDT 部分描畫符表LDT包含了與一個給定義務有關的描畫符,每一個義務都有一個各自LDT。i386的存儲管理單元 選擇器實方式下,段存放器存儲的是真實段地址維護方式下,16位段存放器無法訪問32位段地址,因此,被稱為選擇器,即段存放器是用來選擇描畫符的。i386的存儲管理單元 索引 TI 特權級別153 2 1013位索引段選擇器構造上圖闡明:TI是選擇域,TI1,從部分描畫符表中選擇相應描畫符,TI0,從全局描畫符表中選擇描畫符。索引域給出
4、該選擇符在GDT或LDT中的入口偏移量,選擇符高14位將虛擬地址空間分為16K個獨立段,其中8K個全局段和8K個部分段。第1、0位是特權級,表示選擇器特權級,稱為懇求者特權級RPL。只需懇求者特權級RPL高于或等于相應描畫符特權級DPL,描畫符才干被存取,可以實現一定程度的維護。 i386的存儲管理單元描畫符存放器全局描畫符表存放器GDTR是一個48位的存放器。低16位堅持全局描畫符表GDT大小,最大為64K字節(jié),高32位堅持GDT的段基地址。部分描畫符表存放器LDTR可見部分即程序員可以操作的部分只需16位,不可見部分有48位,放置部分描畫符表的段基地址和界限。i386的存儲管理單元分段方式
5、下,尋址過程如下:在段選擇器中裝入16位數,同時給出32位地址偏移量比如在ESI、EDI中等等。根據段選擇器中的索引值、TI及RPL值,再根據相應描畫符表存放器中的段基地址和段界限,進展一系列合法性檢查如特權級檢查、界限檢查假設無異常,取出相應描畫符放入段描畫符高速緩沖存放器中。將描畫符中的32位段基地址和放在ESI、EDI等中的32位有效地址相加,就構成了32位物理地址。 i386的存儲管理單元i386的存儲管理單元 linux分段機制 linux分頁機制 Linux內存管理實現 Linux的存儲管理思想 Linux分段機制 linux只定義了四種段存放器的取值 內核代碼段 0 x10 內核
6、數據段 0 x18 用戶代碼段 0 x23 用戶數據段 0 x28 Linux的存儲管理思想 Linux的存儲管理思想將上表和段選擇存放器對比可知:闡明: 運用的都是GDT表 運轉級別分為兩級:0和3 Linux的存儲管理思想 GDT初始化信息在arch/i386/kernel/head.S中 Linux的存儲管理思想對照段描畫符的含義,可以得出結論:四個段描畫符內容以下內容根本一樣結論: 一切段都是從0地址開場的4G虛空間,虛擬地址到線性地址的映射是取值不變。 Linux的存儲管理思想 有區(qū)別的地方僅僅是以下部分 結論: 經過如上段映射,之后需求開場進展線性地址映射。 Linux的存儲管理思
7、想 Linux分頁機制 控制存放器CR0、CR3 用CR0的PG位用來控制分頁機制: 1,啟用分頁;0,制止分頁。 CR3用于指示頁目錄表的起始物理地址。 Linux的存儲管理思想 兩級頁表構造 Linux的存儲管理思想頁目錄項 頁目錄項表最多可包含1024個頁目錄項,每個頁目錄項為4字節(jié),構造如下圖。 Linux的存儲管理思想 Linux的存儲管理思想上圖闡明: 第0位是存在位,P1,表示頁表地址指向的 頁在內存中,假設P0,表示不在內存中。 第1位是讀/寫位 第2位是用戶/管理員位,這兩位為頁目錄項 提供維護屬性。 第5位是訪問位,當對頁目錄項進展訪問時, A位1。 第911位由操作系統(tǒng)公
8、用。頁面項 每個頁目錄項指向一個頁表,頁表最多含有1024個頁面項,每項4個字節(jié),包含頁面的起始地址和有關該頁面的信息。 其中,第6位是頁面項獨有的,當對涉及的頁面進展寫操作時,D位被置1。 Linux的存儲管理思想總之,存儲器只需一個頁目錄,有1024個頁目錄項,每個頁目錄項又含有1024個頁面項,因此,存儲器一共可以分成102410241M個頁面。由于每個頁面為4K字節(jié),所以,存儲器的大小正好最多為4GB。 Linux的存儲管理思想頁面高速緩沖存放器在分頁情況下,每次存儲器訪問都要存取兩級頁表,大大降低了訪問速度。為了提高速度,在386中設置了一個最近存取頁面的高速緩沖存放器,自動堅持32
9、項處置器最近運用的頁面地址。 Linux的存儲管理思想 Linux的存儲管理思想linux三級分頁構造 Linux的存儲管理思想地址映射 Linux的存儲管理思想交換控制模塊swap系統(tǒng)調用內存映射模塊mmap內存管理模塊core構造特定模塊MMU Linux的存儲管理思想闡明: 上圖是虛擬內存管理的程序模塊,實現代碼大部分放在/mm目錄下。內存映射模塊mmap 擔任把磁盤文件或交換空間文件的邏輯地址映射到虛擬地址,以及把虛擬地址映射到物理地址。 Linux的存儲管理思想 交換模塊swap 擔任控制內存內容的換入和換出。采用交換機制,從主存中淘汰最近沒被訪問的邏輯頁,保管近來訪問過的邏輯頁。
10、中心內存管理模塊core 擔任中心內存管理功能,如頁的分配、回收和懇求調頁處置等功能,這些功能將別的內核子系統(tǒng)如文件系統(tǒng)所運用。 Linux的存儲管理思想 構造特定的模塊 擔任給各種硬件平臺提供通用接口,主要完成主存初始化任務及對頁面缺點的處置。這個模塊是實現虛擬內存的物理根底。 Linux的存儲管理思想 數據構造 基于Buddy算法的內存頁面管理 基于slab算法的內存分區(qū)管理物理內存空間管理物理內存空間管理數據構造分頁管理構造設置了一個mem_map數組管理內存頁面page, 其在系統(tǒng)初始化時由 free_area_init()函數 創(chuàng)建。數組元素是一個個page構造體,每個 page構造
11、體對應一個物理頁面。page構造定義為mem_map_t類型,定義在/include/linux/mm.h中: typedef struct page struct page *next; struct page *prev; struct inode *inode; unsigned long offset; struct page *next_hash; atomic_t count; unsigned flags; unsigned dirty,age; struct wait_queue *wait; struct buffer_head * buffers; unsigned lon
12、g swap_unlock_entry; unsigned long map_nr; mem_map_t;闡明:Count 共享該頁面的進程計數Age 標志頁面的“年齡Dirty 表示該頁面能否被修正正prev和next: 把page構造體鏈接成一個雙向循環(huán)鏈表prev_hash和next_hash 把有關page構造體連成哈希表物理內存空間管理 inode和offset: 內核以節(jié)點和其上的偏移為鍵值,將頁面組織成哈希表。 Wait 等待該頁資源的進程等待隊列指針 Flag 頁面標志 map_nr 該頁面page構造體在mem_map數組中的下標值,也就是物理頁面的頁號。物理內存空間管理l
13、Buddy算法l Linux對空閑內存空間管理采用Buddy算法。l Buddy算法l 把內存中一切頁面按照2n劃分,其中n=05,每個內存空間按1個頁面、2個頁面、4個頁面、8個頁面、16個頁面、32個頁面進展六次劃分。物理內存空間管理劃分后構成了大小不等的存儲塊,稱為頁面塊,簡稱頁塊。包含1個頁面的頁塊稱為1頁塊,包含2個頁面的稱為2頁塊,依此類推。每種頁塊按前后順序兩兩結合成一對Buddy“同伴 系統(tǒng)按照Buddy關系把具有一樣大小的空閑頁面塊組成頁塊組,即1頁塊組、2頁塊組32頁塊組。每個頁塊組用一個雙向循環(huán)鏈表進展管理,共有個鏈表,分別為1、2、4、8、16、32頁塊鏈表。 分別掛到
14、free_area 數組上。物理內存空間管理位圖數組 標志內存頁面運用情況,第0組每一位表示單個頁面運用情況,1表示運用,0表示空閑,第2組每一位表示比鄰的兩個頁面的運用情況,依次類推。默以為10個數組。 當一對Buddy的兩個頁面塊中有一個是空閑的,而另一個全部或部分被占用時,該位置1。兩個頁面塊都是空閑,或都被全部或部分占用時, 對應位置0。物理內存空間管理內存分配和釋放過程內存分配時,系統(tǒng)按照Buddy算法,根據懇求的頁面數在free_area對應的空閑頁塊組中搜索。假設懇求頁面數不是2的整數次冪,那么按照稍大于懇求數的2的整數次冪的值搜索相應的頁面塊組。物理內存空間管理 當相應頁塊組中
15、沒有可運用的空閑頁面塊時就查詢更大一些的頁塊組, 在找到可用的空閑頁面塊后,分配所需頁面。 當某一空閑頁面塊被分配后,假設仍有剩余的空閑頁面,那么根據剩余頁面的大小把它們參與到相應頁塊組中。物理內存空間管理內存頁面釋放時,系統(tǒng)將其做為空閑頁面對待。 檢查能否存在與這些頁面相鄰的其它空閑頁塊,假設存在,那么合為一個延續(xù)的空閑區(qū)按Buddy算法重新分組。物理內存空間管理物理內存空間管理物理內存空間管理物理內存空間管理 Slab算法 采用buddy算法,處理了外碎片問題,這種方法適宜大塊內存懇求,不適宜小內存區(qū)懇求。如:幾十個或者幾百個字節(jié)。 Linux2.0采用傳統(tǒng)內存分區(qū)算法,按幾何分布提供內存
16、區(qū)大小,內存區(qū)以2的冪次方為單位。雖然減少了內碎片,但沒有顯著提高系統(tǒng)效率。物理內存空間管理 Linux2.4采用了slab分配器算法 該算法比傳統(tǒng)的分配器算法有更好性能和內存利用率,最早在solaris2.4上運用。物理內存空間管理Slab分配器思想小對象的懇求和釋放經過slab分配器來管理。slab分配器有一組高速緩存,每個高速緩存保管同一種對象類型,如i節(jié)點緩存、PCB緩存等。內核從它們各自的緩存種分配和釋放對象。每種對象的緩存區(qū)由一連串slab構成,每個slab由一個或者多個延續(xù)的物理頁面組成。這些頁面種包含了已分配的緩存對象,也包含了空閑對象。物理內存空間管理cacheSlabPCB
17、緩存Slabi節(jié)點緩存PCB緩存i節(jié)點緩存Slab分配器的組成數據構造高速緩存 Struct kmem_cache_s高速緩存種的每個slab數據構造 Struct kmem_slab_s物理內存空間管理C_free,c_nextpC_firstp,c_lastpC_free,c_nextpC_firstp,c_lastpC_free,c_nextpC_firstp,c_lastpS_prevp,s_nextpS_prevp,s_nextpS_prevp,s_nextpS_prevp,s_nextpS_prevp,s_nextpCache構造Cache構造Cache構造Slab構造Slab構造
18、Slab構造Cache構造與slab構造之間的關系創(chuàng)建slab對象過程 Slab分配器調用Kmem_cache_grow() 函數為緩存分配一個新的slab對象。調用kmem_getpages()獲取一組延續(xù)內存頁框;調用kmem_cache_slabmgamt()分配一個新的slab數據構造;調用kmem_cache_init_objs為新slab中包含的一切對象定義構造方法;調用kmem_slab_link_end()將新的slab插入到這個高速緩存的雙向鏈表的末尾。物理內存空間管理優(yōu)點:充分利用了空間,減少了內部碎片 管理部分化,盡能夠減少了與buddy分配器打交道,提高了效率。物理內存
19、空間管理虛擬地址空間管理 進程地址空間 虛擬內存空間管理內存映射進程地址空間 Linux把進程虛擬空間分成兩部分:內核區(qū)和用戶區(qū) 操作系統(tǒng)內核的代碼和數據等被映射到內核區(qū)。進程可執(zhí)行映像代碼和 數據映射到虛擬內存的用戶區(qū)。進程地址空間 虛擬空間管理有關數據構造mm_struct構造體 定義了每個進程的虛存用戶區(qū),首地址在 義務構造體中,定義在 /include/linux/schedul.h中。 虛擬空間管理struct mm_struct int count;pgd_t * pgd;unsigned long context;unsigned long start_code, end_cod
20、e, start_data, end_data;unsigned long start_brk, brk, start_stack, start_mmap;unsigned long arg_start, arg_end, env_start, env_end;unsigned long rss, total_vm, locked_vm;unsigned long def_flags;struct vm_area_struct * mmap;struct vm_area_struct * mmap_avl;struct semaphore mmap_sem;進程虛存區(qū)域 一個虛存區(qū)域是虛存空間
21、中一個延續(xù)區(qū)域,每個虛擬區(qū)域用一個vm_area_struct構造體描畫,定義在/include/linux/mm.h中。 虛擬空間管理struct vm_area_struct struct vm_area_struct struct mm_struct struct mm_struct * * vm_mm; vm_mm; unsigned long vm_start;unsigned long vm_start;unsigned long vm_end;unsigned long vm_end;pgprot_t vm_page_prot;pgprot_t vm_page_prot;unsi
22、gned short vm_flags;unsigned short vm_flags;short vm_avl_height;short vm_avl_height;struct vm_area_struct struct vm_area_struct * * vm_avl_left; vm_avl_left;struct vm_area_struct struct vm_area_struct * * vm_avl_right; vm_avl_right;struct vm_area_struct struct vm_area_struct * * vm_next; vm_next;str
23、uct vm_area_struct struct vm_area_struct * * vm_next_share; vm_next_share;struct vm_area_struct struct vm_area_struct * * vm_prev_share; vm_prev_share;struct vm_operations_struct struct vm_operations_struct * * vm_ops; vm_ops;unsigned long vm_offset;unsigned long vm_offset;struct inode struct inode
24、* * vm_inode; vm_inode;unsigned long vm_pte; unsigned long vm_pte; ; ; 闡明:vm_mm指針指向進程的mm_struct構造體vm_start和vm_end 虛擬區(qū)域的開場和終止地址。vm_page_prot 虛存區(qū)域的頁面的維護特性vm_inode 假設虛存區(qū)域映射的是磁盤文件或設備文件內容,那么vm_inode指向這個文件的inode構造體,否那么vm_inode為NULL。 虛擬空間管理 vm_flags指出了虛存區(qū)域的操作特性: VM_READ 虛存區(qū)域允許讀取 VM_WRITE 虛存區(qū)域允許寫入 VM_EXEC 虛
25、存區(qū)域允許執(zhí)行 VM_SHARED 虛存區(qū)域允許多個進程共享 VM_GROWSDOWN 虛存區(qū)域可以向下延伸 VM_GROWSUP 虛存區(qū)域可以向上延伸 VM_SHM 虛存區(qū)域是共享存儲器的一部分 VM_LOCKED 虛存區(qū)域可以加鎖 VM_STACK_FLAGS 虛存區(qū)域做為堆棧運用 虛擬空間管理 vm_offset 該區(qū)域的內容相對于文件起始位置的偏移量,或相對于共享內存首址的偏移量。 vm_next 一切vm_area_struct構造體鏈接成一個單向鏈表 vm_next指向下一個vm_area_struct構造體。鏈表首地址由mm_struct中成員項mmap指出。 vm_ops是指向
26、vm_operations_struct構造體的指針,該構造體中包含著指向各種操作函數的指針。 虛擬空間管理 vm_avl_left 左指針指向相鄰的低地址虛存區(qū)域 vm_avl_right 右指針指向相鄰的高地址虛存區(qū)域 mmap_avl 表示進程AVL樹的根 vm_avl_hight 表示AVL樹的高度。 vm_next_share和vm_prev_share 把有關vm_area_struct結合成一個共享內存時使 用的雙向鏈表。 虛擬空間管理虛存區(qū)域建立 Linux運用do_mmap()函數完成可執(zhí)行映像向虛存區(qū)域的映射,建立有關的虛存區(qū)域。 do_mmap()函數定義在/mm/mma
27、p.c文件中 虛擬空間管理unsigned long do_mmap(struct file * file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long off) addr 虛存區(qū)域在虛擬內存空間的開場地址 len 是這個虛存區(qū)域的長度。 file 是指向該文件構造體的指針 off 是相對于文件起始位置的偏移量。 prot 指定了虛存區(qū)域的訪問特性: PROT_READ 0 x1 對虛存區(qū)域允許讀取 PROT_WEITE 0 x2 對虛存區(qū)域允許寫入 PROT_EXEC 0 x4 虛存區(qū)域代碼允許執(zhí)行 PROT_NONE 0 x0 不允許訪問該虛存區(qū)域 flag 指定了虛存區(qū)域的屬性: MAP_FIXED 指定虛存區(qū)域固定在addr的位置上 MAP_SHARED 指定對虛存區(qū)域的操作是作用在共享頁面上 MAP_PRIVATE 指定了對虛存區(qū)域的寫入操作將引起頁面拷貝 虛擬空間管理請頁機制 缺頁中斷處置函數 Do_page_fault()交換機制 引入目的 利用外存處理物理內存存儲量缺乏問題 方法 將磁盤上一部分空間作為交換空間,當物理內
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心理教育課程對學生成長的重要性
- 2025版數據中心土建工程承包合同范本2篇
- 二零二五年度附虛擬貨幣銷售合同范本2篇
- 以素質教育為導向的小學生綜合實踐活動
- 2025借款還款合同范本
- 山西財經大學《生物醫(yī)藥信息學》2023-2024學年第一學期期末試卷
- 2025代理貸款中介合同范本
- 情緒調節(jié)策略在學生日常生活中的實踐
- 2025年度物業(yè)與連鎖超市經營性物業(yè)租賃管理服務協(xié)議3篇
- 呂梁師范高等專科學?!渡韺W醫(yī)學哲學》2023-2024學年第一學期期末試卷
- 2025年西藏拉薩市柳梧新區(qū)城市投資建設發(fā)展集團有限公司招聘筆試參考題庫附帶答案詳解
- DB51T 1069-2010 四川泡菜生產規(guī)范
- 斷絕關系協(xié)議書
- 2023-建筑施工技02課件講解
- 2025年部編版一年級語文上冊期末復習計劃
- 2024高考物理一輪復習:觀察電容器的充、放電現象(練習)(學生版+解析)
- 地理2024-2025學年人教版七年級上冊地理知識點
- 2024年度內蒙古自治區(qū)國家電網招聘之電工類綜合練習試卷A卷附答案
- 零售服務質量提升
- 2024-2030年中國電子郵箱行業(yè)市場運營模式及投資前景預測報告
- 基礎設施零星維修 投標方案(技術方案)
評論
0/150
提交評論