番茄花園-第四章內(nèi)存管理lab2課件_第1頁(yè)
番茄花園-第四章內(nèi)存管理lab2課件_第2頁(yè)
番茄花園-第四章內(nèi)存管理lab2課件_第3頁(yè)
番茄花園-第四章內(nèi)存管理lab2課件_第4頁(yè)
番茄花園-第四章內(nèi)存管理lab2課件_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第四章 內(nèi)存管理(lab2)提綱頁(yè)面管理頁(yè)表管理頁(yè)面管理頁(yè)面管理鏈表的結(jié)構(gòu)現(xiàn)在我們來討論用于頁(yè)面管理的雙向鏈表結(jié)構(gòu)。首先,我們來看一下構(gòu)成這個(gè)鏈表的結(jié)點(diǎn)的情況。該結(jié)點(diǎn)的結(jié)構(gòu)是在memlayout.h中規(guī)定的:typedef LIST_ENTRY(Page) Page_LIST_entry_t; struct Page Page_LIST_entry_t pp_link;/* free list link */ pp_ref is the count of pointers (usually in page table entries)/ to this page, for pages allo

2、cated using page_alloc./ Pages allocated at boot time using pmap.cs/ boot_alloc do not have valid reference count fields.uint16_t pp_ref;而LIST_ENTRY的定義則在queue.h中:#defineLIST_ENTRY(type)struct struct type *le_next;/* next element */struct type *le_prev;/* ptr to ptr to this element */頁(yè)面管理(續(xù))通過分析,我們可以

3、寫出Page結(jié)構(gòu):struct Page struct struct Page *le_next;struct Page *le_prev; pp_link;uint16_t pp_ref;頁(yè)面管理(續(xù))系統(tǒng)還定義了一些宏來對(duì)這個(gè)鏈表頭進(jìn)行操作:#defineLIST_FIRST(head)(head)-lh_first)/取得頭指針#defineLIST_INIT(head) /將鏈表重置在queue.h中,還定義了很多用于操縱結(jié)點(diǎn)和對(duì)該雙向鏈表進(jìn)行操作的宏:#defineLIST_NEXT(elm, field)(elm)-field.le_next) /該宏返回elm所的下一個(gè)頁(yè)面管理結(jié)

4、點(diǎn)的地址。elm應(yīng)該為一個(gè)指向頁(yè)面管理結(jié)點(diǎn)的指針,field=pp_link#defineLIST_INSERT_HEAD(head, elm, field) /這個(gè)宏的功能,是將elm指向的頁(yè)面管理結(jié)點(diǎn)成為整個(gè)頁(yè)面管理雙向鏈表的第一個(gè)元素,在實(shí)現(xiàn)上,是要求鏈表頭結(jié)構(gòu)(page_free_list)的lh_first指針指向該結(jié)構(gòu)。這里需要考慮兩種情況,一種是鏈表以前就是空的情況,另一種情況,是鏈表以前不為空的情況。頁(yè)面管理(續(xù))#defineLIST_INSERT_BEFORE(listelm, elm, field)#defineLIST_INSERT_AFTER(listelm, elm

5、, field) /這兩個(gè)宏所要做的事情,是把新的結(jié)點(diǎn)(elm參數(shù)),插入到結(jié)點(diǎn)listelm之前或者之后。對(duì)于Page結(jié)構(gòu)的pp_link.le_next指針的使用,應(yīng)該比較容易理解,需要解釋的是pp_link.le_prev的使用。在鏈表的結(jié)點(diǎn)中,這個(gè)域所指向的前一個(gè)結(jié)點(diǎn)的((elm)-pp_link.le_next)的地址!#defineLIST_REMOVE(elm, field) /該宏所做的工作是將elm所指向的結(jié)點(diǎn)從頁(yè)面管理鏈表中消除。這里要注意pp_link.prev的用法,它只是用來index前一個(gè)結(jié)點(diǎn)的le_next域,從而直接修改里面的內(nèi)容,而不能索引整個(gè)前面的結(jié)點(diǎn)(比方

6、說訪問前一個(gè)結(jié)點(diǎn)的pp_ref域的內(nèi)容),雖然,從鏈表構(gòu)造的角度來說,這樣設(shè)計(jì)就足夠了。#defineLIST_FOREACH(var, head, field) / 這個(gè)宏實(shí)際上寫的是一個(gè)for循環(huán)頭,它的作用是在該循環(huán)中遍歷頁(yè)面管理鏈表。需要注意的是,這個(gè)循環(huán)是不能用pp_link.le_prev域來替代的!頁(yè)面管理(續(xù))頁(yè)面管理鏈表在內(nèi)存中的存儲(chǔ)和放置Boot_alloc();Page_init();check_page_alloc();頁(yè)面管理(續(xù))頁(yè)面管理的操作page_alloc();page_free();頁(yè)表管理三類地址邏輯地址(Virtual Address)是指程序在編譯連

7、接后,變量名字等的符號(hào)地址,在JOS系統(tǒng)中的內(nèi)核部分,該地址是以KERNBASE(默認(rèn)等于0 xF0000000,實(shí)際上可以根據(jù)具體的情況加以修改)開始的。線性地址(Linear Address)是指經(jīng)過x86保護(hù)模式的段地址變換后的地址,該變換的過程是 邏輯地址+段首地址物理地址(Physical Address)是指內(nèi)存存儲(chǔ)單元的編址,如1GB的內(nèi)存,它的物理編址是從0 x00000000到0 x40000000。頁(yè)表管理(續(xù))三類地址的關(guān)系頁(yè)表管理(續(xù))段式地址轉(zhuǎn)換過程為程序的邏輯地址段首地址例如段首地址為0 xf000000時(shí),一個(gè)邏輯地址為0 xf0100000。經(jīng)過轉(zhuǎn)換后,得到線性

8、地址0 x00100000。分頁(yè)機(jī)制需要經(jīng)過設(shè)置CR3和CR0后才打開。在未打開分頁(yè)機(jī)制的情況下,段式地址轉(zhuǎn)換得到的線性地址就是物理地址。在打開分頁(yè)機(jī)制之后,線性地址需要再次經(jīng)過頁(yè)式地址變換才能得到物理地址。頁(yè)表管理(續(xù))頁(yè)式地址轉(zhuǎn)換頁(yè)表管理(續(xù))頁(yè)目錄(表)項(xiàng)的格式每個(gè)頁(yè)目錄或者頁(yè)表都存儲(chǔ)在單獨(dú)的頁(yè)面中每個(gè)4KB的物理頁(yè)面,實(shí)際上它在內(nèi)部分成了1024個(gè)單元(10位有1024個(gè)可能的值),每個(gè)單元占4字節(jié)(32位,也就是保護(hù)模式下一個(gè)uint32_t類型所占的內(nèi)存空間大?。?,它們稱為頁(yè)目錄項(xiàng)(Page Directory Entry),這些單元與頁(yè)表中包含的單元在格式上是一致的,不同的是頁(yè)表

9、中的單元稱為頁(yè)表項(xiàng)(Page Table Entry)。頁(yè)表管理(續(xù))頁(yè)目錄(表)項(xiàng)的格式(續(xù))高20位存儲(chǔ)的是一個(gè)地址,但因?yàn)橹挥懈?0位(使用的時(shí)候低位會(huì)被全部清零),所以只能尋址4KB對(duì)齊的地址空間(這就是為什么我們?cè)跒轫?yè)目錄分配空間時(shí)要尋找內(nèi)核代碼后第一個(gè)4KB對(duì)齊的地址的原因),同時(shí),由于x86把所有物理內(nèi)存分成了4KB大小的頁(yè),每個(gè)頁(yè)的首地址必然是4KB對(duì)齊的!所以這個(gè)表項(xiàng)中的高20位地址能夠定位到內(nèi)存中任何一個(gè)物理頁(yè)面的首地址。P Present,該位用來判斷對(duì)應(yīng)物理頁(yè)面是否存在,如果存在,該位置1,否則為0;R/W Read/Write,該位用來判斷對(duì)所指向的物理頁(yè)面的訪問權(quán)限

10、,如果為1,表示頁(yè)面可寫,否則,是只讀頁(yè)面;U/S User/Supervisor,該位用來定義頁(yè)面的訪問者應(yīng)該具備的權(quán)限。如果為1,表示該頁(yè)面是User權(quán)限的,大家都可以訪問,如果為0,表示只能是Ring0中的程序能訪問;D Dirty,是否被修改;A Accessed,最近是否被訪問;AVAIL Available,可以被系統(tǒng)程序所使用;0 保留位,不能使用。這些位系統(tǒng)在訪問一個(gè)頁(yè)面時(shí)就會(huì)自動(dòng)地去判斷,如果訪問不符合規(guī)矩(如頁(yè)面根本就不存在,或者權(quán)限不對(duì)的情況),系統(tǒng)就會(huì)產(chǎn)生異常,讓系統(tǒng)去處理。頁(yè)表管理(續(xù))頁(yè)式地址轉(zhuǎn)換的分析對(duì)于頁(yè)式地址管理,由于頁(yè)目錄以及頁(yè)表都存放在物理內(nèi)存的頁(yè)面中,要

11、進(jìn)行地址變換就勢(shì)必先要到內(nèi)存中訪問頁(yè)目錄和頁(yè)表。由于CPU和內(nèi)存速度的不匹配,這樣將勢(shì)必極大地降低系統(tǒng)的效率。為了提高地址翻譯的速度,提高系統(tǒng)的效率,x86系統(tǒng)中設(shè)計(jì)了用于地址翻譯的緩存來解決這一問題,這一緩存稱為TLB(Translation Look-aside buffer,即旁路轉(zhuǎn)換緩沖,或稱為頁(yè)表緩沖),在該緩存中存放了用于最近幾次地址翻譯的頁(yè)表項(xiàng),由于程序執(zhí)行的局部性原理,下一次的地址轉(zhuǎn)換往往跟上一次的地址轉(zhuǎn)換采用的是同一個(gè)頁(yè)目錄表項(xiàng)和頁(yè)表項(xiàng)),同時(shí),由于TLB跟處理器的距離更近,這樣就極大地提高了地址翻譯的效率和速度。但是,這樣做可能存在一個(gè)潛在的問題:頁(yè)目錄(表)數(shù)據(jù)項(xiàng)的不一致

12、性。以前系統(tǒng)里對(duì)應(yīng)一個(gè)線性地址只有唯一的存放在內(nèi)存中的頁(yè)目錄和頁(yè)表,用于完成翻譯的工作,但是,現(xiàn)在由于TLB的存在,系統(tǒng)可能在高速緩存中也存放了一份頁(yè)表項(xiàng)數(shù)據(jù),用于更快地對(duì)地址進(jìn)行翻譯,大多數(shù)時(shí)候,它們是一致的,但是也有例外的情形。因?yàn)門LB中的數(shù)據(jù)對(duì)于程序員來說,是不可見的,程序?qū)τ陧?yè)表項(xiàng)或者頁(yè)目錄項(xiàng)的修改并不能馬上反映到TLB中,這樣就可能導(dǎo)致錯(cuò)誤的地址翻譯,因?yàn)闉榱颂岣叻g的速度,處理器總是盡量地采用TLB中的頁(yè)表數(shù)據(jù)進(jìn)行地址的翻譯。所以,為了避免這種數(shù)據(jù)的不一致性所導(dǎo)致的地址翻譯的錯(cuò)誤情形的出現(xiàn),系統(tǒng)程序員就必須在對(duì)頁(yè)表進(jìn)行修改后,使TLB中舊的頁(yè)表數(shù)據(jù)失效。使其失效的辦法有兩個(gè),一個(gè)

13、是重載CR3,使整個(gè)TLB中的數(shù)據(jù)都失效,也可以采用invlpg指令。頁(yè)表管理(續(xù))頁(yè)目錄、頁(yè)表和數(shù)據(jù)頁(yè)的關(guān)聯(lián)Code walk and implementationpgdir_walk()page_lookup()page_remove()page_insert()boot_map_segment()頁(yè)表管理(續(xù))pgdir_walkpte_t * pgdir_walk(pde_t *pgdir, const void *va, int create)檢查虛擬地址(應(yīng)該是線性地址)va已經(jīng)能夠用頁(yè)表(頁(yè)目錄+頁(yè)表的體系)翻譯,如果能夠,則返回該地址對(duì)應(yīng)的頁(yè)表項(xiàng)的地址;如果不能,同時(shí)creat

14、e=0的話,則返回空(NULL);但是,如果create=1的話,為該地址創(chuàng)建對(duì)應(yīng)的頁(yè)表(因?yàn)闆]有實(shí)際物理頁(yè)面相對(duì)應(yīng),即使創(chuàng)建,返回的頁(yè)表項(xiàng)中的地址部分也為空?。?,并返回va所對(duì)應(yīng)的頁(yè)表項(xiàng)的地址。注意:該函數(shù)返回的頁(yè)表項(xiàng)地址為內(nèi)核地址!頁(yè)表管理(續(xù))page_lookupstruct Page * page_lookup(pde_t *pgdir, void *va, pte_t *pte_store)在頁(yè)式地址翻譯機(jī)制中查找線性地址va所對(duì)應(yīng)的物理頁(yè)面,如果找到,則返回該物理頁(yè)面,并將對(duì)應(yīng)的頁(yè)表項(xiàng)的地址放到pte_store中;如果找不到,或其他原因,則返回空(NULL)。頁(yè)表管理(續(xù))pa

15、ge_removevoid page_remove(pde_t *pgdir, void *va)刪除線性地址va所對(duì)應(yīng)的物理頁(yè)面。注意:在刪除頁(yè)面的時(shí)候,調(diào)用的是page_decref(),僅減低該頁(yè)面的引用度,而不一定要將頁(yè)面刪除。同時(shí),由于頁(yè)表項(xiàng)發(fā)生了修改,刪除操作完成后,應(yīng)該調(diào)用tlb_invalidate()更新TLB。頁(yè)表管理(續(xù))page_insertint page_insert(pde_t *pgdir, struct Page *pp, void *va, int perm)這是JOS在實(shí)現(xiàn)頁(yè)面支持中最重要的一個(gè)函數(shù),該函數(shù)的功能是將頁(yè)面管理結(jié)構(gòu)pp所對(duì)應(yīng)的物理頁(yè)面分配給線

16、性地址va。同時(shí),將對(duì)應(yīng)的頁(yè)表項(xiàng)的permission設(shè)置成PTE_P&perm。注意:一定要考慮到線性地址va已經(jīng)指向了另外一個(gè)物理頁(yè)面或者干脆就是這個(gè)函數(shù)要指向的物理頁(yè)面的情況。如果線性地址va已經(jīng)指向了另外一個(gè)物理頁(yè)面,則先要調(diào)用page_remove將該物理頁(yè)從線性地址va處刪除,再將va對(duì)應(yīng)的頁(yè)表項(xiàng)的地址賦值為pp對(duì)應(yīng)的物理頁(yè)面。如果va指向的本來就是參數(shù)pp所對(duì)應(yīng)的物理頁(yè)面,則將va對(duì)應(yīng)的頁(yè)表項(xiàng)中的物理地址賦值重新賦值為pp所對(duì)應(yīng)的物理頁(yè)面的首地址即可。頁(yè)表管理(續(xù))JOS的線性地址規(guī)劃頁(yè)表管理(續(xù))按照J(rèn)OS的要求,一共有三個(gè)線性地址到物理地址的映射是必須的:UPAGES, sizeof(PAGES) = pages, sizeof(PAGES)這里PAGES代表頁(yè)面管理結(jié)構(gòu)所占用的空間;KSTACKTO

溫馨提示

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

評(píng)論

0/150

提交評(píng)論