- 論壇徽章:
- 0
|
現(xiàn)在明白了!!!!
Intel 80x86段頁(yè)內(nèi)存尋址機(jī)制、Linux-0.11內(nèi)存管理機(jī)制
一、Intel 80x86段頁(yè)內(nèi)存管理機(jī)制
1.段選擇符
段選擇符(段寄存器的低16位)指示著段的描述符,在段描述符中包含有定義段所用的全部信息。段選擇符具體包括:
(1)索引字段:是由13位組成。利用索引字段可以從擁有8192個(gè)段描述符的段描述
符表中選出任何一個(gè)段描述符來(lái)。處理機(jī)用8(8是段描述符的字段數(shù))乘以索引值再加上描述符的基地址(來(lái)自全局描述符寄存器,或者局部描述符寄存器)就是索引字段值。
(2)段描述符指示段字段Ti:這個(gè)字段用來(lái)說(shuō)明使用的是全局描述表GDT,還是局部
描述用符表LDT。若這一位被清成0,說(shuō)明選擇的是全局描述符GDT,若這一位被置成1,說(shuō)明當(dāng)前選中了局部描述符表。
(3)請(qǐng)求特權(quán)級(jí)字段RPL:這個(gè)字段由兩位(位1和位0)組成,所以可以表示0-3共4
個(gè)特權(quán)級(jí)。若這個(gè)字段所含的表示特權(quán)級(jí)的值比程序的特權(quán)級(jí)值。丛撟侄嗡硎镜奶貦(quán)級(jí)比程序的高),它就會(huì)在使用這個(gè)選擇符去訪問(wèn)這個(gè)程序時(shí)覆蓋掉這個(gè)程序的特權(quán)級(jí)。
2.80x86的段頁(yè)內(nèi)存尋址機(jī)制
在保護(hù)方式下,80386不僅采用擴(kuò)充的存儲(chǔ)器分段管理機(jī)制,而且提供可選的存儲(chǔ)器分頁(yè)
管理機(jī)制。這些存儲(chǔ)管理機(jī)制由80386存儲(chǔ)管理部件MMU實(shí)現(xiàn)。
(1)目標(biāo)
80386有32根地址線,在保護(hù)方式下,它們都能發(fā)揮作用,所以可尋址的物理地址空間高達(dá)4G字節(jié)。在以80386及其以上處理器為CPU的PC兼容機(jī)系統(tǒng)中,把地址在1M以下的內(nèi)存稱(chēng)為常規(guī)內(nèi)存,把地址在1M 以上的內(nèi)存稱(chēng)為擴(kuò)展內(nèi)存。
80386 還要對(duì)實(shí)現(xiàn)虛擬存儲(chǔ)器提供支持。雖然與8086可尋址的1M字節(jié)物理地址空間相比,80386可尋址的物理地址空間可謂很大,但實(shí)際的微機(jī)系統(tǒng)不可能安裝如此達(dá)的物理內(nèi)存。所以,為了運(yùn)行大型程序和真正實(shí)現(xiàn)多任務(wù),必須采用虛擬存儲(chǔ)器。虛擬存儲(chǔ)器是一種軟硬件結(jié)合的技術(shù),用于提供比在計(jì)算機(jī)系統(tǒng)中實(shí)際可以使用的物理主存儲(chǔ)器大得多的存儲(chǔ)空間。這樣,程序員在編寫(xiě)程序時(shí)不用考慮計(jì)算機(jī)中物理存儲(chǔ)器的實(shí)際容量。
80386還要對(duì)存放在存儲(chǔ)器中的代碼及數(shù)據(jù)的共享和保護(hù)提供支持。任務(wù)甲和任務(wù)乙并存,任務(wù)甲和任務(wù)乙必須隔離,以免相互影響。但它們又可能要共享部分代碼和數(shù)據(jù)。所以,80386既要支持任務(wù)隔離,又要支持可共享代碼和數(shù)據(jù)的共享,還要支持特權(quán)保護(hù)。
(2)地址空間和地址轉(zhuǎn)換
保護(hù)方式下的虛擬存儲(chǔ)器由大小可變的存儲(chǔ)塊構(gòu)成,這樣的存儲(chǔ)塊稱(chēng)為段。80386采用稱(chēng)為描述符表(即段表,包括GDT和IDT)來(lái)描述段的位置、大小和使用情況。虛擬存儲(chǔ)器的地址由指示描述符的選擇子和段內(nèi)偏移兩部分構(gòu)成,這樣的地址集合稱(chēng)為虛擬地址空間。80386支持的虛擬地址空間可達(dá)64T字節(jié)(虛擬地址空間由GDT 映射的全局地址空間和由LDT映射的局部地址空間組成。選擇符的索引部分由13 個(gè)比特位表示,加上區(qū)分GDT和LDT的1 個(gè)比特位,因此Intel 80X86 CPU 共可以索引16384 個(gè)選擇符。若每個(gè)段的長(zhǎng)度都取最大值4G,則最大虛擬地址空間范圍是16384 * 4G = 64T)。程序員編寫(xiě)程序時(shí)使用的存儲(chǔ)地址空間是虛擬地址空間,所以,他們可認(rèn)為有足夠大的存儲(chǔ)空間可供使用。
顯然,只有在物理存儲(chǔ)器中的程序才能運(yùn)行,只有在物理存儲(chǔ)器中的數(shù)據(jù)才能訪問(wèn)。因
此,虛擬地址空間必須映射到物理地址空間,二維的虛擬地址必須轉(zhuǎn)化成一維的物理地址。由于物理地址空間遠(yuǎn)小于虛擬地址空間,所以只有虛擬地址空間中的部分可以映射到物理地址空間。由于物理存儲(chǔ)器的大小要遠(yuǎn)小于物理地址空間,所以只有上述部分中的部分才能真正映射到物理存儲(chǔ)器。
線性地址空間由一維的線性地址構(gòu)成,線性地址空間和物理地址空間對(duì)等。線性地址32位長(zhǎng),線性地址空間容量為4GB。
每一個(gè)任務(wù)有一個(gè)虛擬地址(邏輯地址)空間。80386分兩步實(shí)現(xiàn)虛擬地址(邏輯地址)空間到物理地址空間到物理地址空間的映射,也就是分兩步實(shí)現(xiàn)虛擬地址(邏輯地址)到物理地址的轉(zhuǎn)換,但第二步是可選的(即分頁(yè)機(jī)制可選)。
通過(guò)描述符表(即段表,包括GDT和IDT)和描述符,分段管理機(jī)制實(shí)現(xiàn)虛擬地址空間到線性地址空間的映射,實(shí)現(xiàn)把二維的虛擬地址轉(zhuǎn)換為一維的線性地址。這一步總是存在的。
分頁(yè)管理機(jī)制把線性地址空間和物理地址空間分別劃分為大小相同的塊,這樣的塊稱(chēng)為頁(yè)。通過(guò)在線性地址空間的頁(yè)與物理地址空間的頁(yè)建立之間建立的映射表(即頁(yè)表,每個(gè)進(jìn)程都可以擁有自己的頁(yè)表),分頁(yè)管理機(jī)制實(shí)現(xiàn)線性地址空間到物理地址空間的映射,實(shí)現(xiàn)線性地址到物理地址的轉(zhuǎn)換。分頁(yè)管理機(jī)制是可選的,在不采用分頁(yè)管理機(jī)制時(shí),線性地址空間就等同于物理地址空間,線性地址就等于物理地址。
分段管理機(jī)制所使用的可變大小的塊,時(shí)分段管理機(jī)制比較適宜處理復(fù)雜系統(tǒng)的邏輯分段。存儲(chǔ)塊的大小可以根據(jù)適當(dāng)?shù)倪壿嫼x進(jìn)行定義,而不用考慮固定大小的頁(yè)所強(qiáng)加的人為限制。每個(gè)段可作為獨(dú)立的單位處理,以簡(jiǎn)化段的保護(hù)及共享。分頁(yè)機(jī)制使用的固定大小的塊最適合于管理物理存儲(chǔ)器,無(wú)論是管理內(nèi)存還是外存都同樣有效。分頁(yè)管理機(jī)制能夠有效地支持實(shí)現(xiàn)虛擬存儲(chǔ)器。
段及分頁(yè)這兩種機(jī)制是兩種不同的轉(zhuǎn)換機(jī)制,是整個(gè)地址轉(zhuǎn)換函數(shù)的不同的轉(zhuǎn)換級(jí)。雖然兩種機(jī)制都利用存儲(chǔ)在主存儲(chǔ)器中的轉(zhuǎn)換表,但這些表具有獨(dú)立的結(jié)構(gòu)。事實(shí)上,段表存儲(chǔ)在線性地址空間,而頁(yè)表存儲(chǔ)在物理地址空間。因此,段轉(zhuǎn)換表可由分頁(yè)機(jī)制重新進(jìn)行定位而不需段機(jī)制的參與。段轉(zhuǎn)換機(jī)制把虛擬地址轉(zhuǎn)換為線性地址,并在線性地址中訪問(wèn)段轉(zhuǎn)換機(jī)制的表格,而不會(huì)覺(jué)察分頁(yè)機(jī)制已把線性地址轉(zhuǎn)換為物理地址。類(lèi)似地,分頁(yè)機(jī)制對(duì)于程序產(chǎn)生的地址所使用的虛擬地址空間一無(wú)所知。分頁(yè)機(jī)制只是直接地把線性地址轉(zhuǎn)換為物理地址,并且在物理地址中訪問(wèn)轉(zhuǎn)換表格,并不知道虛擬地址空間的存在,甚至不知道段轉(zhuǎn)換機(jī)制的存在。
(3)虛擬存儲(chǔ)器概念
80386支持的虛擬地址空間可達(dá)64TB。虛擬地址空間由GDT 映射的全局地址空間和由LDT映射的局部地址空間組成。選擇符的索引部分由13 個(gè)比特位表示,加上區(qū)分GDT和LDT的1 個(gè)比特位,因此Intel 80X86 CPU 共可以索引16384 個(gè)選擇符。若每個(gè)段的長(zhǎng)度都取最大值4GB,則最大虛擬地址空間范圍是16384 * 4GB = 64TB。
虛擬存儲(chǔ)器是一種設(shè)計(jì)技術(shù),用于提供比在計(jì)算機(jī)系統(tǒng)中實(shí)際可以使用的物理主存儲(chǔ)器大得多的存儲(chǔ)空間。使用者會(huì)產(chǎn)生一種錯(cuò)覺(jué),好象在程序中可以使用非常大的物理存儲(chǔ)空間。使用虛擬存儲(chǔ)器的好處是:一個(gè)程序可以很容易地在物理存儲(chǔ)器容量大不一樣的、配置范圍很廣的計(jì)算機(jī)上運(yùn)行;編程人員使用虛擬存儲(chǔ)器可以寫(xiě)出比任何實(shí)際配置的物理存儲(chǔ)器都大得多的程序。虛擬存儲(chǔ)器由存儲(chǔ)管理機(jī)制及一個(gè)大容量的快速硬盤(pán)存儲(chǔ)器支持。在程序運(yùn)行的任何時(shí)刻,只把虛擬地址空間的一小部分映射到主存儲(chǔ)器,其余部分則存儲(chǔ)在磁盤(pán)上。因?yàn)橹挥写鎯?chǔ)在主存儲(chǔ)器中的部分虛擬存儲(chǔ)器可由處理器使用,這種虛擬存儲(chǔ)技術(shù)將依賴(lài)程序內(nèi)部訪問(wèn)存儲(chǔ)器的局部化特性,在程序執(zhí)行中只需整個(gè)虛擬存儲(chǔ)器中的少量存儲(chǔ)內(nèi)容在主存儲(chǔ)器中駐留。而當(dāng)訪問(wèn)存儲(chǔ)器的范圍發(fā)生變化時(shí),有必要把虛擬存儲(chǔ)器的某些部分從磁盤(pán)調(diào)入主存儲(chǔ)器,虛擬存儲(chǔ)器的另外的部分,也能從主存儲(chǔ)器傳送回磁盤(pán)上。
3.對(duì)頁(yè)表的進(jìn)一步說(shuō)明
在32位邏輯地址空間的分頁(yè)系統(tǒng)中,每個(gè)頁(yè)表項(xiàng)占用4個(gè)字節(jié),共32位,由于每頁(yè)大小為4KB,并且位于4KB邊界上,故其低12位總是0,因此頁(yè)表項(xiàng)的低12位可做他用。頁(yè)表項(xiàng)的高20位 + 頁(yè)內(nèi)偏移地址(12位) = 32位,可尋址4GB地址空間。每個(gè)進(jìn)程都可以擁有自己的頁(yè)表,頁(yè)表占用的內(nèi)存空間最大為(2^20)*4B = 4MB = 1K個(gè)頁(yè)面(當(dāng)然實(shí)際進(jìn)程的頁(yè)表只是這其中的一部分,并不總是4MB,頁(yè)表項(xiàng)數(shù)要看進(jìn)程需要的內(nèi)存空間的大小而定,頁(yè)表只包括進(jìn)程所擁有的那些頁(yè))。
二、80x86段頁(yè)機(jī)制下的Linux-0.11的內(nèi)存管理機(jī)制
實(shí)際上,分段和分頁(yè)在某種程度上有點(diǎn)沉余,因?yàn)樗鼈兌伎梢詣澐诌M(jìn)程的物理地址空間:分段可以給每個(gè)進(jìn)程分配不同的線性地址空間,而分頁(yè)可以把同一線性地址空間映射到不同的物理空間。采用分頁(yè)機(jī)制后,就沒(méi)必要再將進(jìn)程分配到不同的線性地址空間。但Linux-0.11內(nèi)核通過(guò)共享頁(yè)目錄和線性地址分段,利用了80x86的分段機(jī)制,即采用段頁(yè)機(jī)制。Linux-0.99及以后的版本中不再共享頁(yè)目錄,不再對(duì)線性地址分段,使每個(gè)進(jìn)程都擁有4GB線性空間,邏輯地址=線性地址,巧妙的“繞過(guò)了”Intel 80x86提供的分段機(jī)制,即采用分頁(yè)機(jī)制。
Linux-0.11內(nèi)核采用段頁(yè)機(jī)制對(duì)內(nèi)存進(jìn)行管理,具體如下:
Linux-0.11內(nèi)存物理地址0處開(kāi)始放著一頁(yè)頁(yè)目錄表和四頁(yè)頁(yè)表。這一個(gè)頁(yè)目錄表是所有64個(gè)進(jìn)程共享的。其后的四頁(yè)頁(yè)表正好映射16M物理內(nèi)存,是進(jìn)程0的頁(yè)表。以后創(chuàng)建進(jìn)程時(shí)頁(yè)表需要從主內(nèi)存區(qū)申請(qǐng),而頁(yè)目錄項(xiàng)直接從頁(yè)目錄表中取。這樣進(jìn)程和頁(yè)目錄表頁(yè)存在一一對(duì)應(yīng)關(guān)系,任務(wù)號(hào)為nr的進(jìn)程,對(duì)應(yīng)頁(yè)目錄的第nr*16 ~ (nr+1)*16一共16個(gè)目錄項(xiàng)。這樣1個(gè)頁(yè)目錄表占據(jù)1個(gè)物理頁(yè)面,即4KB,每個(gè)頁(yè)目錄項(xiàng)為4字節(jié),因此共又1K個(gè)頁(yè)目錄項(xiàng);每個(gè)頁(yè)目錄項(xiàng)對(duì)應(yīng)一頁(yè)的頁(yè)表,即1K個(gè)頁(yè)表項(xiàng),每個(gè)頁(yè)表項(xiàng)可以映射4K的物理內(nèi)存,因此共有1K*1K*4K=4G的線性空間。這4G的線性空間由64個(gè)進(jìn)程共享,通過(guò)對(duì)線性地址進(jìn)行分段,每個(gè)進(jìn)程都有64MB的線性空間,這樣每個(gè)進(jìn)程都會(huì)有16個(gè)連續(xù)的頁(yè)目錄項(xiàng)。
|
|