![第十章記憶體管理實(shí)作_第1頁(yè)](http://file4.renrendoc.com/view14/M00/3F/37/wKhkGWZBvUqAflbBAAKCjSdheTY798.jpg)
![第十章記憶體管理實(shí)作_第2頁(yè)](http://file4.renrendoc.com/view14/M00/3F/37/wKhkGWZBvUqAflbBAAKCjSdheTY7982.jpg)
![第十章記憶體管理實(shí)作_第3頁(yè)](http://file4.renrendoc.com/view14/M00/3F/37/wKhkGWZBvUqAflbBAAKCjSdheTY7983.jpg)
![第十章記憶體管理實(shí)作_第4頁(yè)](http://file4.renrendoc.com/view14/M00/3F/37/wKhkGWZBvUqAflbBAAKCjSdheTY7984.jpg)
![第十章記憶體管理實(shí)作_第5頁(yè)](http://file4.renrendoc.com/view14/M00/3F/37/wKhkGWZBvUqAflbBAAKCjSdheTY7985.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1作業(yè)系統(tǒng)第十章記憶體管理實(shí)作2記憶體管理實(shí)作硬體上的支援不可或缺Linux使用Intel的分頁(yè)式分段功能來(lái)轉(zhuǎn)換邏輯位址與實(shí)體位址跨平臺(tái):讓Linux能在其他非Intel平臺(tái)上執(zhí)行,記憶體管理模型須不受處理器差異影響主記憶體分配:核心:用來(lái)儲(chǔ)存核心程式碼與靜態(tài)核心資料結(jié)構(gòu)動(dòng)態(tài)記憶體:其他的部分稱(chēng)之??蓜?dòng)態(tài)給使用者行程或核心使用動(dòng)態(tài)記憶體的管理影響系統(tǒng)效能甚巨3第十章記憶體管理實(shí)作記憶體定址硬體分段支援Linux上的分段硬體分頁(yè)支援Linux上的分頁(yè)頁(yè)框管理記憶體區(qū)域管理摘要4記憶體定址(1)Intel80x86提供分頁(yè)式分段的功能
3種記憶體定址的方式:實(shí)體位址:記憶體中實(shí)際的位址線(xiàn)性位址:一塊4GB大小的虛擬空間;系統(tǒng)利用此空間作分段與分頁(yè)透過(guò)邏輯位址:可選擇到線(xiàn)性位址空間中一個(gè)分段裡的任一個(gè)位元組透過(guò)分段單元的硬體電路:把邏輯位址轉(zhuǎn)換成線(xiàn)性位址若轉(zhuǎn)換成功,再透過(guò)分頁(yè)單元把線(xiàn)性位址轉(zhuǎn)換成實(shí)體位址5邏輯位址轉(zhuǎn)換分段單元分頁(yè)單元線(xiàn)性位址邏輯位址實(shí)體位址6記憶體定址(2)Intel架構(gòu)下,記憶體架構(gòu)分為2部分分段:將程式分割成程式碼、資料與堆疊等模組,使多個(gè)工作互不干擾,在同一個(gè)處理器上執(zhí)行分頁(yè):需求分頁(yè),虛擬記憶體分段的做法:將程式的分段劃分在線(xiàn)性位址空間裡分段描述器:記錄此分段起始線(xiàn)性位址及分段的大小可以找到分段的線(xiàn)性位址;避免存取超出此分段以外的空間7記憶體定址(3)邏輯位址由分段選擇器和段偏移組成透過(guò)分段選擇器,可從描述器表(如GDT)中找到此分段的分段描述器
得到分段的起始線(xiàn)性位址配合邏輯位址中的段偏移,就能定址到此分段在線(xiàn)性位址空間的位址分頁(yè)的做法:將線(xiàn)性位址空間中的分段再細(xì)分成許多分頁(yè)這些分頁(yè)可存放在記憶體或磁碟內(nèi)作業(yè)系統(tǒng)透過(guò)分頁(yè)目錄和分頁(yè)表格,可得分頁(yè)在實(shí)體記憶體或磁碟中的實(shí)際位址8硬體分段支援(1)Intel微處理器以真實(shí)模式與保護(hù)模式進(jìn)行位址轉(zhuǎn)換保護(hù)模式下,Intel架構(gòu)提供4G位元組的實(shí)體位址空間(因處理器的位址匯流排為32位元)真實(shí)模式下的硬體分段沒(méi)有作用保護(hù)模式下的硬體分段支援分段暫存器分段描述器分段選擇器9硬體分段支援(2)分段暫存器:儲(chǔ)存分段選擇器的內(nèi)容,計(jì)有6個(gè),分別為cs、ss、ds、es、fs與gscs暫存器:指向一個(gè)包含程式碼的分段
ss暫存器:指向目前的程式堆疊分段
ds暫存器:指向靜態(tài)或是外部資料分段其他3分段暫存器可指向任何分段cs暫存器另一重要功能:包含2個(gè)CPL位元(定義CPU目前權(quán)限等級(jí))若CPL數(shù)值為0,表示最高等級(jí)若CPL數(shù)值為3,表示最低等級(jí)以L(fǎng)inux系統(tǒng)為例,利用CPL的數(shù)值為0或3來(lái)表示目前是處?kù)逗诵哪J交蚴褂谜吣J?0硬體分段支援(3)分段描述器:每個(gè)分段都用一個(gè)8位元組的分段描述器來(lái)描述該分段的特徵,如分段大小、分段所在位置、存取控制權(quán)及狀態(tài)等資訊儲(chǔ)存在GDT(全域描述器表)或LDT(區(qū)域描述器表)中作業(yè)系統(tǒng)通常只定義一個(gè)GDT,但每個(gè)行程都有各自的LDT主記憶體中,GDT的位址會(huì)存放在gdtr暫存器;目前正在使用的LDT的位址存在ldtr暫存器11分段描述器格式6362616059585756555453525150494847464544434241403938373635343332313029282726252423222120191817161514131211100123456789LIMIT(0-15)BASE(0-15)BASE(16-23)TYPESDPL1BASE(24-31)GD/B0AVLLIMIT(16-19)12硬體分段支援(4)分段描述器中的各項(xiàng)欄位:G旗標(biāo):設(shè)定分段的單位大小當(dāng)G旗標(biāo)設(shè)定為1,分段單位為4K位元組;否則分段單位為1位元組LIMIT欄位:描述分段的長(zhǎng)度CPU把分段描述器中第0到15位元與第48到51位元合併成20個(gè)位元的分段界限,且依據(jù)G旗標(biāo)的設(shè)定形成不同的分段界限範(fàn)圍如果G旗標(biāo)設(shè)定為0,分段大小會(huì)介於1B(位元組)到1MB;否則分段大小會(huì)介於4KB到4GBBASE欄位:描述分段的基底位址CPU把分段描述器中的第16到39位元與第56到63位元共計(jì)32位元合併成分段開(kāi)始的線(xiàn)性位址S旗標(biāo):若此旗標(biāo)是0,表示此分段用來(lái)儲(chǔ)存核心資料結(jié)構(gòu)的系統(tǒng)分段;否則代表它是一般的程式碼或資料分段13硬體分段支援(5)TYPE欄位:表示分段的型態(tài)與存取權(quán)限D(zhuǎn)PL(描述器權(quán)限)欄位:設(shè)定存取該分段的權(quán)限範(fàn)圍由0到3,數(shù)值為0時(shí)表示權(quán)限最大D/B旗標(biāo):表示分段包含程式碼或資料兩者定義上不同,設(shè)定為1時(shí)表示段偏移的位址為32位元,否則只有16位元P旗標(biāo):設(shè)定為1時(shí)表示該分段在主記憶體中第53個(gè)位元:是一個(gè)保留位元,通常被設(shè)定為0AVL欄位:可由作業(yè)系統(tǒng)自行定義使用;Linux沒(méi)有使用此欄位14硬體分段支援(6)分段選擇器:加速邏輯位址與線(xiàn)性位址間的轉(zhuǎn)換額外特殊的暫存器都包含8位元組大小的分段描述器當(dāng)分段選擇器的內(nèi)容載入到分段暫存器中,該對(duì)應(yīng)的分段描述器也從記憶體載入到對(duì)應(yīng)的特殊暫存器邏輯位址轉(zhuǎn)換可不透過(guò)GDT或LDT;CPU直接存取非程式控制暫存器的內(nèi)容只有在分段暫存器的內(nèi)容改變時(shí)才需對(duì)GDT或LDT作讀取15分段選擇器與分段描述器分段選擇器分段描述器分段暫存器分段描述器非程式控制暫存器分段描述器表16硬體分段支援(7)分段選擇器的各項(xiàng)欄位:分段索引:13位元當(dāng)成描述器表的索引TI旗標(biāo):指示分段描述器在GDT(TI為0)或在LDT(TI為1)中RPL(要求者權(quán)限)欄位:2位元的欄位,指示CPU目前的權(quán)限等級(jí)(要求CPU作記憶體存取的使用者權(quán)限)欲得分段描述器在GDT或LDT中的相對(duì)位址
利用分段選擇器中最高13個(gè)位元的數(shù)值乘上817硬體分段支援(8)把邏輯位址轉(zhuǎn)成線(xiàn)性位址的步驟:檢查T(mén)I欄位,確定對(duì)應(yīng)的分段描述器在GDT或LDT中索引欄位的數(shù)值乘以8再加上gdtr或ldtr中的數(shù)值
分段描述器的位址把邏輯位址的段偏移加上分段描述器中的基底位址欄位,就可以得到線(xiàn)性位址當(dāng)分段暫存器內(nèi)容改變時(shí)才需要執(zhí)行前面步驟18分段選擇器與邏輯位址轉(zhuǎn)換gdtr或ldtr
++線(xiàn)性位址3233343531分段索引(35-47)TIRPL段偏移(0-31)47邏輯位址分段選擇器分段描述器gdt或ldt0819Linux上的分段(1)Linux中採(cǎi)用分頁(yè)式分段之原因:當(dāng)行程共用相同線(xiàn)性位址,記憶體管理變方便,易達(dá)分段共用Linux在設(shè)計(jì)上想適用於目前各種常用架構(gòu)
可將所有的分段描述器都儲(chǔ)存在GDT中Linux中的GDT是以gdt_table陣列來(lái)實(shí)作,用變數(shù)gdt指向該陣列核心中不使用區(qū)域描述器表(LDT),但允許行程透過(guò)系統(tǒng)呼叫建立LDTLinux下使用多個(gè)分段,如核心程式碼分段、核心資料分段、使用者程式碼分段、使用者資料分段、TSS分段、與LDT分段等20Linux上的分段(2)TSS分段:存放每個(gè)行程暫存器與I/O位元映射的內(nèi)容分段大小的分段界限欄位設(shè)定為0xebTYPE欄位設(shè)定為9或11使用者模式下不允許行程存取TSS分段,故DPL設(shè)為0Linux核心2.4中,所有行程的TSS分段不存在,改由指向存放原先每個(gè)行程TSS分段內(nèi)容的指標(biāo)來(lái)代替21Linux上的分段(3)LDT分段:儲(chǔ)存在變數(shù)default_ldt中,預(yù)設(shè)是給所有的行程所共用每個(gè)行程都有自己的分段描述器,指到預(yù)設(shè)的共用LDT分段,分段裡的基底位址欄位設(shè)定為default_ldt的位址,分段大小的分段界限設(shè)定為7若行程需要一個(gè)真正的LDT,會(huì)建立一個(gè)長(zhǎng)度為4096位元組的分段,該分段最多包含511個(gè)分段描述器,該行程所屬的預(yù)設(shè)LDT分段描述器則被放置到GDT中22Linux上的分段(4)對(duì)每個(gè)行程而言,GDT可以放入TSS分段或LDT分段2種不同的分段描述器GDT中最大可儲(chǔ)存的欄位數(shù)目為12+2×NR_TASKS(NR_TASKS:系統(tǒng)裡行程最大的數(shù)目)行程被建立時(shí)TSS與LDT分段描述器被加到GDT中核心初始化時(shí)trap_init()函式利用set_tss_desc(0,&init_task.tss)把第一個(gè)行程的TSS分段描述器加到GDT中第一個(gè)行程再利用copy_thread()建立其他子行程,該函式喚起clone()與fork()的系統(tǒng)呼叫,也執(zhí)行set_tss_desc(nr,&(task[nr]->tss))函式設(shè)定新行程的TSS分段23Linux上的分段(5)CPU的特權(quán)等級(jí)代表一個(gè)行程在使用者模式或是核心模式目前的特權(quán)等級(jí)可由儲(chǔ)存在cs暫存器之分段選擇器內(nèi)的RPL欄位決定當(dāng)目前的特權(quán)等級(jí)改變,所對(duì)應(yīng)的分段暫存器也必須修改
ss暫存器中也相同:當(dāng)系統(tǒng)從使用者模式切換到核心模式時(shí),必須確定ss暫存器包含核心資料區(qū)段的分段選擇器24硬體分頁(yè)支援(1)分頁(yè)單元:把線(xiàn)性位址轉(zhuǎn)成實(shí)體位址檢查存取的類(lèi)型是否與線(xiàn)性位址提供的存取型態(tài)不一致若記憶體存取不合法
分頁(yè)錯(cuò)誤視主記憶體為許多固定長(zhǎng)度的頁(yè)框集合(頁(yè)框又稱(chēng)為實(shí)體頁(yè))每個(gè)頁(yè)框包含一個(gè)分頁(yè)分頁(yè)代表一個(gè)區(qū)塊的資料,可儲(chǔ)存在頁(yè)框中或磁碟中25硬體分頁(yè)支援(2)分頁(yè)表:將線(xiàn)性位址轉(zhuǎn)換實(shí)體位址的資料結(jié)構(gòu)儲(chǔ)存在主記憶體中分頁(yè)單元啟動(dòng)時(shí),核心會(huì)初始化分頁(yè)表Intel處理器中,藉由設(shè)定cr0暫存器中的PG旗標(biāo)啟動(dòng)分頁(yè)功能當(dāng)PG數(shù)值未設(shè)定(其值為0),表示線(xiàn)性位址會(huì)直接被當(dāng)成實(shí)體位址解譯(分頁(yè)功能未啟動(dòng))26硬體分頁(yè)支援(3)分頁(yè):Intel處理器中的分頁(yè)單元可處理4KB大小的分頁(yè)
32位元的線(xiàn)性位址分成3個(gè)欄位:最高10個(gè)位元為目錄;中間10個(gè)位元為表格;最低的12個(gè)位元為頁(yè)偏移線(xiàn)性位址轉(zhuǎn)換有兩步驟,每個(gè)步驟都需要一個(gè)轉(zhuǎn)換表格,第一:分頁(yè)目錄,第二:分頁(yè)表分頁(yè)目錄:起始實(shí)體位址儲(chǔ)存在cr3行程暫存器目錄欄位:決定參考分頁(yè)目錄中的哪一個(gè)項(xiàng)目表格欄位:決定要參考分頁(yè)表中的哪一個(gè)項(xiàng)目,包含某個(gè)頁(yè)框的實(shí)體位址頁(yè)偏移欄位:決定在頁(yè)框中的相對(duì)位置因?yàn)轫?yè)偏移有12個(gè)位元,故每個(gè)分頁(yè)可含4096個(gè)位元組27Intel80x86下的分頁(yè)法+cr3++分頁(yè)分頁(yè)表分頁(yè)目錄目錄表格頁(yè)偏移線(xiàn)性位址0111221223128硬體分頁(yè)支援(4)目錄與表格欄位都使用10個(gè)位元,故分頁(yè)目錄與分頁(yè)表可含1024個(gè)項(xiàng)目一個(gè)分頁(yè)目錄可以定址1024×1024×4096=232
記憶體儲(chǔ)存格分頁(yè)目錄與分頁(yè)表具有相同的結(jié)構(gòu),包含下列欄位:出現(xiàn)旗標(biāo):旗標(biāo)為1:表示此分頁(yè)已載入到主記憶體旗標(biāo)為0:表示此分頁(yè)不在主記憶體中存取旗標(biāo):分頁(yè)單元存取過(guò)某頁(yè)框後,存取旗標(biāo)會(huì)被設(shè)定分頁(yè)單元不能對(duì)此旗標(biāo)作重設(shè),只能透過(guò)作業(yè)系統(tǒng)29硬體分頁(yè)支援(5)修改旗標(biāo):只在分頁(yè)表中使用當(dāng)頁(yè)框被寫(xiě)入,會(huì)設(shè)定此旗標(biāo);在作業(yè)系統(tǒng)選擇某頁(yè)進(jìn)行替換時(shí),會(huì)使用到此旗標(biāo)分頁(yè)單元不能對(duì)此旗標(biāo)作重設(shè),只能透過(guò)作業(yè)系統(tǒng)讀寫(xiě)旗標(biāo):指定分頁(yè)或分頁(yè)表的存取權(quán)限(讀?。瘜?xiě)入或讀?。?quán)限旗標(biāo):指定存取分頁(yè)或分頁(yè)表所需的權(quán)限等級(jí)30硬體分頁(yè)支援(6)PCD和PWT旗標(biāo):用在硬體快取PCD指示存取頁(yè)框中的資料時(shí)是否使用快取PWT指示用何種策略將資料分頁(yè)寫(xiě)入頁(yè)框策略:寫(xiě)回或?qū)懘┊?dāng)PCD與PWT都設(shè)為0,表示快取啟動(dòng)且採(cǎi)用寫(xiě)回策略分頁(yè)大小旗標(biāo):只在分頁(yè)目錄中使用此旗標(biāo)設(shè)為1:在分頁(yè)目錄中參考到4MB大小的分頁(yè)31硬體分頁(yè)支援(7)延伸分頁(yè):Intel從Pentium處理器開(kāi)始支援允許頁(yè)框的大小為4KB或4MB延伸分頁(yè)的模式下,分頁(yè)單元把32位元的線(xiàn)性位址分成兩欄位最高的10個(gè)位元為目錄,剩餘22個(gè)位元為頁(yè)偏移使延伸分頁(yè)與一般分頁(yè)共存,可設(shè)定cr4暫存器中的PSE旗標(biāo)使用大塊區(qū)域的線(xiàn)性位址對(duì)應(yīng)到實(shí)體位址核心不需要再透過(guò)中間層的分頁(yè)表,可節(jié)省中間分頁(yè)表的空間;但可能增加內(nèi)部斷裂32延伸分頁(yè)0+cr3+分頁(yè)目錄分頁(yè)目錄頁(yè)偏移線(xiàn)性位址2122314MB的分頁(yè)33硬體分頁(yè)支援(8)硬體保護(hù)機(jī)制:
Intel處理器中允許分段利用權(quán)限旗標(biāo)來(lái)設(shè)定4種存取權(quán)限等級(jí)只有2種用在分頁(yè)與分頁(yè)表中若權(quán)限旗標(biāo)為1:該頁(yè)可隨時(shí)被存取若為0,只有在CPL小於3的權(quán)限下才能存取分段有3種存取權(quán)限(讀取、寫(xiě)入與執(zhí)行)分頁(yè)只有2種存取權(quán)限(讀取與寫(xiě)入)假設(shè)分頁(yè)目錄或分頁(yè)表裡的讀寫(xiě)旗標(biāo)為0,表示對(duì)應(yīng)的分頁(yè)表或分頁(yè)只能讀??;否則可讀取或?qū)懭?4硬體分頁(yè)支援(9)三層式分頁(yè):32位元的架構(gòu),採(cǎi)用兩層式分頁(yè)法64位元的架構(gòu),採(cǎi)用三層式分頁(yè)分頁(yè)大小為16KB,可定址214
個(gè)位址頁(yè)偏移欄位用14個(gè)位元,剩餘50個(gè)位元分配給目錄欄位與表格欄位;不該浪費(fèi)如此大空間儲(chǔ)存分頁(yè)目錄與分頁(yè)表Compaq’sAlpha處理器
64位元的架構(gòu),採(cǎi)用三層式分頁(yè)每個(gè)頁(yè)框大小為8KB,頁(yè)偏移欄位為13個(gè)位元系統(tǒng)只用最低的43個(gè)位元,剩餘的21個(gè)較高位元被設(shè)為0剩下的30個(gè)位元可平均分配成三個(gè)10位元的欄位(全域目錄、中間目錄與表格)35Linux中分頁(yè)的模式+cr3+++分頁(yè)全域目錄全域目錄中間目錄表格頁(yè)偏移線(xiàn)性位址分頁(yè)中間目錄分頁(yè)表分頁(yè)36Linux上的分頁(yè)(1)Linux採(cǎi)用三層式分頁(yè)全域分頁(yè)目錄、中間分頁(yè)目錄與分頁(yè)表也適用64位元的架構(gòu)全域分頁(yè)目錄:包含多個(gè)中間分頁(yè)目錄的位址中間分頁(yè)目錄:包含多個(gè)分頁(yè)表的位址分頁(yè)表中的項(xiàng)目均會(huì)指到一個(gè)頁(yè)框故線(xiàn)性位址被分成4個(gè)欄位每個(gè)欄位使用多少位元,必須視電腦的硬體架構(gòu)而定37Linux上的分頁(yè)(2)行程擁有各自的全域分頁(yè)目錄與數(shù)個(gè)分頁(yè)表行程發(fā)生內(nèi)文切換,核心把cr3暫存器的內(nèi)容儲(chǔ)存到TSS分段中載入另一個(gè)TSS分段的內(nèi)容到cr3中當(dāng)新的行程恢復(fù)執(zhí)行,分頁(yè)單元才能指到正確的分頁(yè)表Linux應(yīng)用在32位元的架構(gòu)上,不使用中間分頁(yè)目錄,但仍保留它
使得相同的程式碼可以在32位元或64位元的架構(gòu)下執(zhí)行核心設(shè)計(jì)把中間分頁(yè)目錄的大小設(shè)為1,使記憶體模型設(shè)計(jì)與處理器無(wú)關(guān)38Linux上的分頁(yè)(3)分頁(yè)表的處理:Linux核心原始碼中的asm/page.h與asm/pgtable.h中定義讀取及修改分頁(yè)表與分頁(yè)目錄時(shí)所需的資料結(jié)構(gòu)、函式與巨集,供分頁(yè)表進(jìn)行處理,如型態(tài)轉(zhuǎn)換、讀取或修改分頁(yè)表中的項(xiàng)目、查詢(xún)分頁(yè)表中某項(xiàng)目的旗標(biāo)狀態(tài)或數(shù)值、從分頁(yè)表的項(xiàng)目中取出分頁(yè)位址等全域分頁(yè)目錄、中間分頁(yè)目錄與分頁(yè)表內(nèi)的項(xiàng)目都是32位元的資料型態(tài)還有一個(gè)32位元的資料型態(tài)用來(lái)表示某個(gè)單一項(xiàng)目的保護(hù)旗標(biāo)39Linux上的分頁(yè)(4)分頁(yè)表會(huì)儲(chǔ)存在頁(yè)框中;每個(gè)行程會(huì)使用多個(gè)分頁(yè)表頁(yè)框的分配與釋放耗時(shí)當(dāng)核心用完一個(gè)分頁(yè)表後,會(huì)把分頁(yè)表所使用的頁(yè)框加入到一個(gè)軟體快取中當(dāng)核心下次要建立新的分頁(yè)表時(shí),直接由從軟體快取中取得一個(gè)頁(yè)框只在軟體快取為空,才向系統(tǒng)要求配置一個(gè)新頁(yè)框40Linux上的分頁(yè)(5)分頁(yè)表快取採(cǎi)用是軟體快取,沒(méi)有硬體空間的限制核心必須實(shí)作一機(jī)制來(lái)限定快取所使用的空間,並設(shè)定快取使用的上限與下限在系統(tǒng)閒置、或核心釋放一個(gè)行程所擁有的分頁(yè)表時(shí),系統(tǒng)會(huì)檢查每個(gè)快取所使用的空間是否超過(guò)上限,若超過(guò)便會(huì)釋放快取中的頁(yè)框,直到快取所使用的空間達(dá)下限為止41Linux上的分頁(yè)(6)保留頁(yè)框:核心程式碼與資料結(jié)構(gòu)儲(chǔ)存於此不能被動(dòng)態(tài)地分配或置換到磁碟中Linux核心會(huì)被安裝在實(shí)體記憶體位址為0x00100000處核心所需要的頁(yè)框總數(shù)會(huì)少於2MB核心不載入到0x00100000之前的記憶體空間之因?考慮個(gè)人電腦結(jié)構(gòu)上的特性:BIOS使用第0個(gè)頁(yè)框來(lái)儲(chǔ)存系統(tǒng)硬體上的設(shè)定從0x000a0000到0x000fffff的實(shí)體位址保留給BIOS函式使用有些特殊的電腦硬體會(huì)使用到第一個(gè)可用的1MB空間為了避免將核心載入到不連續(xù)的頁(yè)框,Linux不用記憶體中第一個(gè)1MB的空間42記憶體中前
2MB的空間分佈i386_endbase_text_etext_end_edata可使用頁(yè)框核心程式碼初始化核心資料未初始化核心資料010x1000x1ff不可使用頁(yè)框43第十章記憶體管理實(shí)作記憶體定址頁(yè)框管理頁(yè)框運(yùn)作對(duì)偶式系統(tǒng)演算法
記憶體區(qū)域管理摘要44頁(yè)框管理Linux中採(cǎi)用的頁(yè)框大小單位是4KB硬體分頁(yè)電路在進(jìn)行位址轉(zhuǎn)換時(shí),會(huì)自動(dòng)檢查頁(yè)框中是否有分頁(yè)存在;每個(gè)頁(yè)框透過(guò)分頁(yè)表中的各種旗標(biāo)來(lái)達(dá)到硬體保護(hù)4KB是大部分磁碟區(qū)塊大小的倍數(shù),選擇4KB作為頁(yè)框大小,容易知道分頁(yè)單元在位址轉(zhuǎn)換的過(guò)程中哪裡發(fā)生分頁(yè)錯(cuò)誤在主記憶體與磁碟間傳輸資料時(shí)較有效率45頁(yè)框運(yùn)作(1)頁(yè)框管理:核心須記錄每個(gè)頁(yè)框目前的狀態(tài);核心也須知道在動(dòng)態(tài)記憶體中的頁(yè)框是否在使用狀態(tài)資訊保存在描述器陣列中;每個(gè)頁(yè)框?qū)?yīng)到一個(gè)陣列元素頁(yè)框描述器結(jié)構(gòu)如下:
count變數(shù)設(shè)為0:表示對(duì)應(yīng)的頁(yè)框未被使用;如果數(shù)值大於0,表示此頁(yè)框被分配給一個(gè)以上的行程、或是用來(lái)儲(chǔ)存核心資料結(jié)構(gòu)46頁(yè)框運(yùn)作(2)list為一環(huán)狀雙向鏈結(jié)串列變數(shù)flags:表示目前頁(yè)框的狀態(tài)指標(biāo)next_hash與pprev_hash:參考在雜湊串列表page_hash_table中的相對(duì)分頁(yè)當(dāng)行程要讀取某個(gè)檔案的分頁(yè),系統(tǒng)先檢查雜湊表,確定該分頁(yè)是否已在快取中buffer指標(biāo):指向此分頁(yè)所在的快取緩衝區(qū)47頁(yè)框運(yùn)作(3)typedefstructpage{structlist_headlist;/*對(duì)應(yīng)到一環(huán)狀雙向鏈結(jié)串列*/structaddress_space*mapping;/*記錄此分頁(yè)儲(chǔ)存在哪個(gè)
inode裡*/structpage*next_hash;atomic_tcount;/*記錄使用該分頁(yè)的行程數(shù)目*/unsignedlongflags;structlist_headlru;/*記錄要置換出去的分頁(yè)串列*/structpage**pprev_hash;structbuffer_head*buffers;}mem_map_t;48描述頁(yè)框狀態(tài)的旗標(biāo)(1)PG_locked表示此分頁(yè)需要被鎖定在記憶體中進(jìn)行磁碟
I/O。當(dāng)
I/O開(kāi)始時(shí)此位元會(huì)被設(shè)定為
1,I/O結(jié)束後此旗標(biāo)會(huì)被清為
0。PG_error表示此分頁(yè)有磁碟
I/O錯(cuò)誤發(fā)生。PG_referenced此旗標(biāo)表示此分頁(yè)被配置並曾被存取。PG_uptodate除非磁碟的
I/O發(fā)生錯(cuò)誤,不然此旗標(biāo)會(huì)在完成磁碟讀取操作後被設(shè)定為
1。PG_dirty此旗標(biāo)用來(lái)表示此分頁(yè)是否需要被寫(xiě)回磁碟。PG_unused未使用。PG_lru此旗標(biāo)表示此分頁(yè)目前被存放在系統(tǒng)的
activelist
或是inactivelist之中。49描述頁(yè)框狀態(tài)的旗標(biāo)(2)PG_active此旗標(biāo)表示此分頁(yè)正被行程所使用(存放在系統(tǒng)的activelist之中)。PG_slab表示此分頁(yè)正被
slaballocator所使用。PG_skip此旗標(biāo)用在
sparc/sparc64架構(gòu)下已忽略部分的位址空間。PG_highmem表示此分頁(yè)被載入到高核心位址空間。PG_checked表示此分頁(yè)只能被
EXT2檔案系統(tǒng)所使用。PG_arch_1硬體結(jié)構(gòu)上特定的分頁(yè)狀態(tài)旗標(biāo),當(dāng)此分頁(yè)首次加入快取時(shí),該旗標(biāo)會(huì)被設(shè)為
0。PG_reserved表示此頁(yè)框會(huì)保留給核心程式碼使用、或是根本不能使用,此旗標(biāo)被設(shè)定的分頁(yè)不能被換出記憶體。PG_launder當(dāng)某分頁(yè)要被換出記憶體時(shí)此旗標(biāo)將被設(shè)定,表示此分頁(yè)正被虛擬記憶體寫(xiě)回。50頁(yè)框運(yùn)作(4)所有頁(yè)框描述器均儲(chǔ)存在mem_map陣列中每個(gè)頁(yè)框描述器均小於64位元組,1MB的記憶體需4個(gè)頁(yè)框來(lái)儲(chǔ)存mem_map陣列MAP_NR巨集以頁(yè)框位址當(dāng)參數(shù)去計(jì)算頁(yè)框的號(hào)碼,用此號(hào)碼當(dāng)mem_map陣列的索引系統(tǒng)透過(guò)free_area_init()函式初始頁(yè)框描述器此函式2個(gè)參數(shù)start_mem:在核心保留動(dòng)態(tài)記憶體的起始線(xiàn)性位址end_mem:為動(dòng)態(tài)記憶體最終的線(xiàn)性位址加1利用i386_endbase變數(shù)儲(chǔ)存保留頁(yè)框的初始位址;分配適當(dāng)大小的記憶體區(qū)塊給mem_map陣列使用除了PG_reserved與PG_DMA旗標(biāo)外,陣列中所有的欄位初始皆設(shè)為051記憶體分佈0x10000硬體保留核心保留i386_enbasestart_memend_mem動(dòng)態(tài)記憶體52頁(yè)框運(yùn)作(5)men_init()函式:將頁(yè)框中的PG_reserved旗標(biāo)設(shè)為0,之後這些頁(yè)框可當(dāng)成動(dòng)態(tài)記憶體使用將所有實(shí)體位址大於或等於0x1000000分頁(yè)中的PG_DMA旗標(biāo)設(shè)為0(因ISADMA處理器只能存取第一個(gè)16MB的記憶體空間)計(jì)算系統(tǒng)中共有多少頁(yè)框,並把數(shù)值存在變數(shù)num_physpages中;計(jì)算旗標(biāo)是PG_reserved的保留頁(yè)框數(shù)編譯核心的過(guò)程中,計(jì)算保留給硬體頁(yè)框的數(shù)目、核心程式碼頁(yè)框的數(shù)目、核心資料頁(yè)框的數(shù)目、與用來(lái)初始化核心且成功釋放的頁(yè)框數(shù)目將在動(dòng)態(tài)記憶體中每個(gè)頁(yè)框的count欄位設(shè)定1,並呼叫free_page()函式來(lái)漸增變數(shù)nr_free_pages的值
獲得動(dòng)態(tài)記憶體中所有的頁(yè)框數(shù)53頁(yè)框運(yùn)作(6)系統(tǒng)透過(guò)以下4個(gè)不同的函式或巨集來(lái)配置頁(yè)框__get_free_pages(gfp_mask,order):向系統(tǒng)要求2order
個(gè)連續(xù)頁(yè)框__get_dma_pages(gfp_mask,order):向系統(tǒng)取得適用於DMA的頁(yè)框,此巨集會(huì)再呼叫__get_free_pages(gfp_mask|GFP_DMA,order)巨集__get_free_page(gfp_mask):配置一個(gè)頁(yè)框,相當(dāng)於__get_free_pages(gfp_mask,0)get_free_page(gfp_mask):再呼叫__get_free_page(gfp_mask),並在頁(yè)框中填滿(mǎn)0gfp_mask參數(shù):指定如何找尋一個(gè)可用頁(yè)框54函式__get_free_pages()中
gfp_mask常用參數(shù)值名稱(chēng)說(shuō)明GFP_ATOMIC此旗標(biāo)表示呼叫者需要馬上處理、而且不可被中斷。中斷處理函式使用此旗標(biāo)要求頁(yè)框配置,以避免被中斷或是進(jìn)行
I/O。GFP_NOIO此旗標(biāo)表示所要求的頁(yè)框不能進(jìn)行
I/O,可供已經(jīng)在進(jìn)行
I/O的呼叫者使用,以避免發(fā)生更多的
I/O動(dòng)作。GFP_NOHIGHIO此旗標(biāo)僅供
alloc_bounce_page()使用。GFP_NOFS此旗標(biāo)表示不能使用檔案系統(tǒng),供緩衝區(qū)快取及檔案系統(tǒng)使用以避免遞迴呼叫。GFP_NFS在
2.0的核心中表示保留的分頁(yè)數(shù)目從
20個(gè)減到
5個(gè),如此可加快
NFS運(yùn)算的執(zhí)行。但在
2.4的核心中已不支援。GFP_KERNEL此旗標(biāo)表示呼叫者可以對(duì)分頁(yè)進(jìn)行任何的動(dòng)作,但是可以被中斷。GFP_USER在
2.4的核心中與
GFP_KERNEL相同。GFP_HIGHUSER與GFP_USER的不同在於會(huì)優(yōu)先由高記憶體配置頁(yè)框。GFP_KSWAPD在
2.4的核心中與
GFP_KERNEL相同。55對(duì)偶式系統(tǒng)演算法(1)配置連續(xù)頁(yè)框必須有效率;為了提高使用率也須解決外部斷裂的問(wèn)題,2種方式可避免:利用硬體將非連續(xù)的可用區(qū)塊對(duì)映到連續(xù)線(xiàn)性位址發(fā)展特別的技術(shù)來(lái)記錄未使用的頁(yè)框,Linux核心使用此法如DMA要求記憶體來(lái)做緩衝區(qū),必須要使用連續(xù)的頁(yè)框Linux使用對(duì)偶式系統(tǒng)演算法解決外部斷裂所有未被使用的頁(yè)框會(huì)被分成10種區(qū)塊大小的頁(yè)框串列,分別包含了1、2、4、8、16、32、64、128、256及512個(gè)連續(xù)頁(yè)框其中每個(gè)區(qū)塊中第一個(gè)頁(yè)框的實(shí)體位址一定是區(qū)塊大小的倍數(shù)56對(duì)偶式系統(tǒng)演算法(2)對(duì)偶式系統(tǒng)演算法的運(yùn)作:假設(shè)某行程要求128個(gè)連續(xù)頁(yè)框,系統(tǒng)首先檢查在區(qū)塊大小為128頁(yè)框的串列中是否有未使用的區(qū)塊如果沒(méi)有找到,再去區(qū)塊為256頁(yè)框的串列中找尋如果有,系統(tǒng)會(huì)分配128個(gè)頁(yè)框給該行程,剩餘的128個(gè)頁(yè)框就併入?yún)^(qū)塊為128頁(yè)框的串列中如果在區(qū)塊為256頁(yè)框的串列中找不到可用區(qū)塊,就到區(qū)塊為512頁(yè)框的串列中找尋如果有,將會(huì)分配128個(gè)頁(yè)框來(lái)滿(mǎn)足要求,剩餘的384個(gè)頁(yè)框,將會(huì)分成256與128個(gè)頁(yè)框,分別擺入?yún)^(qū)塊為256頁(yè)框的串列與區(qū)塊為128頁(yè)框的串列中如果區(qū)塊為512頁(yè)框的串列也找不到,演算法將停止並發(fā)出錯(cuò)誤狀況的信號(hào)57對(duì)偶式系統(tǒng)演算法(3)當(dāng)行程不再需要部分頁(yè)框時(shí),將會(huì)釋放核心會(huì)將2個(gè)大小為b且未使用的對(duì)偶區(qū)塊合併成一個(gè)大小為2b的區(qū)塊所謂對(duì)偶區(qū)塊是指:這2區(qū)塊大小相同這2區(qū)塊實(shí)體位址連續(xù)第1個(gè)區(qū)塊,第1個(gè)頁(yè)框的實(shí)體位址是2×b×212的倍數(shù)58對(duì)偶式系統(tǒng)演算法(4)Linux使用2種不同對(duì)偶式系統(tǒng)一是用來(lái)處理ISADMA的頁(yè)框另一是處理其他的頁(yè)框每個(gè)對(duì)偶式系統(tǒng)的主要資料結(jié)構(gòu):使用前述的men_map陣列一個(gè)元素型態(tài)是free_area_struct的二維陣列free_area,每個(gè)元素分別對(duì)應(yīng)一種不同區(qū)塊大小的頁(yè)框串列變數(shù)free_area[0]與free_area[1]都指到一個(gè)對(duì)偶式系統(tǒng)所使用的陣列,各有10個(gè)元素不同處:free_area[0]所對(duì)應(yīng)的頁(yè)框不適用於ISADMA,free_area[1]卻適用於ISADMA每個(gè)頁(yè)框串列都對(duì)應(yīng)一個(gè)二位元的位元映像表,每個(gè)位元都對(duì)應(yīng)到一個(gè)頁(yè)框區(qū)塊(記錄區(qū)塊的配置狀況)59對(duì)偶式系統(tǒng)的資料結(jié)構(gòu)20212223242526272829mem_mapfree_area[0]位元映像60對(duì)偶式系統(tǒng)演算法(5)free_area[0]與free_area[1]陣列裡的每個(gè)元素都具有資料結(jié)構(gòu)是free_area_struct的型別此結(jié)構(gòu)中的前兩欄位會(huì)指到相對(duì)應(yīng)的分頁(yè)描述器;Linux會(huì)利用free_area_struct資料結(jié)構(gòu)來(lái)指向一個(gè)分頁(yè)描述器,該結(jié)構(gòu)定義如下:structfree_area_struct{
structpage*next;
structpage*prev;
unsignedint*map;
unsignedlongcount;};61對(duì)偶式系統(tǒng)演算法(6)free_area[0]或free_area[1]陣列中的第k元素free_area[0/1][k]會(huì)透過(guò)next與prev來(lái)實(shí)作一個(gè)大小為2k的環(huán)狀雙向鏈結(jié)串列每一個(gè)節(jié)點(diǎn)都是一個(gè)頁(yè)框區(qū)塊中第一個(gè)頁(yè)框的描述器count欄位會(huì)記錄著對(duì)應(yīng)的串列中有多少個(gè)元素map欄位指到一個(gè)位元映像表,大小則視有多少個(gè)存在的頁(yè)框每個(gè)位元對(duì)應(yīng)到2個(gè)同樣大小的連續(xù)區(qū)塊若該位元為0,表示這2區(qū)塊都沒(méi)有被使用、或是都在使用中;若該位元為1,代表這2區(qū)塊只有1個(gè)在使用中當(dāng)有2個(gè)相同大小的區(qū)塊沒(méi)有在使用,核心將這2個(gè)區(qū)塊視為一2倍大的區(qū)塊62第十章記憶體管理實(shí)作記憶體定址頁(yè)框管理記憶體區(qū)域管理Slab配置器Slab運(yùn)作摘要63記憶體區(qū)域管理記憶體區(qū)域是一塊任意長(zhǎng)度且具有連續(xù)實(shí)體位址的記憶體採(cǎi)用新的資料結(jié)構(gòu),描述如何從一個(gè)頁(yè)框中配置小塊的記憶體區(qū)域;會(huì)產(chǎn)生內(nèi)部斷裂
Linux中提供許多大小以等比級(jí)數(shù)成長(zhǎng)的記憶體區(qū)域(所配置的記憶體區(qū)域大小是2的次方)保證內(nèi)部斷裂小於50%Linux使用Slab配置器,可更有效地利用記憶體空間64Slab配置器頻繁的呼叫對(duì)偶式系統(tǒng)使核心效率變差對(duì)偶式系統(tǒng)每次最少配置一個(gè)頁(yè)框,如果資料結(jié)構(gòu)所需記憶體大小只要幾百個(gè)位元組,剩下的空間就浪費(fèi)了Slab配置器將資料視為物件概念:將要求而來(lái)的記憶體根據(jù)物件的大小等分後,再配置給物件去使用加入快取的概念來(lái)增加效能特性:當(dāng)有物件被釋放掉的時(shí)候,空的欄位不會(huì)再被初始化;當(dāng)Slab配置器中都沒(méi)有物件,記憶體也不會(huì)馬上回收,以此減少額外配置與釋放的負(fù)擔(dān)65
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源儲(chǔ)能項(xiàng)目落戶(hù)保障合同
- 廚具設(shè)備購(gòu)銷(xiāo)合同(31篇)
- 教學(xué)工作總結(jié)英語(yǔ)2024(32篇)
- 2023-2024學(xué)年浙江省寧波市鎮(zhèn)海中學(xué)高三下學(xué)期期中考試歷史試卷
- 2025年業(yè)務(wù)提升合作諒解協(xié)議
- 2025年供應(yīng)鏈管理公司合作項(xiàng)目協(xié)議書(shū)
- 2025年產(chǎn)品創(chuàng)新與生產(chǎn)協(xié)作協(xié)議
- 2025年農(nóng)村醫(yī)療人員定向就業(yè)協(xié)議
- 2025年大數(shù)據(jù)項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模板
- 2025年遠(yuǎn)程醫(yī)療項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 第25章 概率初步(2)-2024-2025學(xué)年數(shù)學(xué)人教版九年級(jí)上冊(cè)(含答案解析)
- 2025年交通運(yùn)輸部長(zhǎng)江口航道管理局招聘4人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測(cè)試(零模)英語(yǔ) 含解析
- 蘭溪市排水防澇提升雨污管網(wǎng)修復(fù)改造初步設(shè)計(jì)文本
- 2024-2030年中國(guó)永磁電機(jī)市場(chǎng)現(xiàn)狀分析及前景趨勢(shì)預(yù)測(cè)報(bào)告
- 翁愷C語(yǔ)言課件下載
- 2024-2025學(xué)年人教版八年級(jí)上冊(cè)地理期末測(cè)試卷(一)(含答案)
- DB3209T 1236-2023 西蘭花采后處理與貯運(yùn)技術(shù)規(guī)程
- 《液壓缸與設(shè)計(jì)》課件
- 山東省物流工程師職稱(chēng)考試參考試題庫(kù)-上(單選題)
- GB/T 44546-2024建筑用裝配式集成吊頂通用技術(shù)要求
評(píng)論
0/150
提交評(píng)論