轉(zhuǎn)載自:http://blog.csdn.net/rosetta 64KB-4GB-64TB,?我記得大學(xué)的匯編課程,、組成原理課里老師講過實(shí)模式和保護(hù)模式的區(qū)別,在很多書本上也有談及,,無奈本人理解和感悟能力實(shí)在太差,,在很長(zhǎng)一段時(shí)間里都沒真正的明白它們的內(nèi)含,,更別說為什么實(shí)模式下最大尋址空間為1MB?段的最大長(zhǎng)度不超過64KB,?而保護(hù)模式下為啥最大尋址能力就變成了64TB,?每個(gè)段最大也達(dá)4GB? 更甚者分段和分頁這兩個(gè)高深的概念像我這種菜鳥怎么也理解不了??! 尋址能力都達(dá)64TB了,為啥我的電腦內(nèi)存只有2GB呢,?其實(shí)不用糾結(jié)于這事,,這64TB就是所謂的虛擬地址空間,也叫邏輯地址空間,,它能夠?qū)ぶ愤@么多,,只是它有這個(gè)能力,,并不代表你的內(nèi)存就要裝這么大,,你內(nèi)存比它小再多也不會(huì)影響你工作,,反過來,要是它的尋址能力只有1MB,,而你有2GB的內(nèi)存,,那么那1.999GB就沒有實(shí)際用處了,這就太浪費(fèi)資源了,。而實(shí)際上這個(gè)64TB也沒有什么實(shí)際意義,,因?yàn)?2位的地址總線能尋址的線性地址空間和物理地址空間都是2^32=4GB。這個(gè)64TB是怎么出來的,,稍后揭曉,。 實(shí)模式與保護(hù)模式的來歷我們先來說一下為什么有實(shí)模式和保護(hù)模式的區(qū)別。最早期的8086 CPU只有一種工作方式,,那就是實(shí)模式,,而且數(shù)據(jù)總線為 16位,地址總線為20位,,實(shí)模式下所有寄存器都是16位,。而從80286開始就有了保護(hù)模式,從80386開始CPU數(shù)據(jù)總線和地址總線均為32位,,而且寄存器都是32位,。但80386以及現(xiàn)在的奔騰、酷睿等等CPU為了向前兼容都保留了實(shí)模式,,現(xiàn)代操作系統(tǒng)在剛加電時(shí)首先運(yùn)行在實(shí)模式下,,然后再切換到保護(hù)模式下運(yùn)行。 再來區(qū)別下幾個(gè)基本概念:邏輯地址,、線性地址和物理地址,。這些概念一時(shí)沒領(lǐng)會(huì)沒關(guān)系。繼續(xù)往下看,。 三種地址邏輯地址:即邏輯上的地址,,實(shí)模式下由“段基地址+段內(nèi)偏移”組成;保護(hù)模式下由“段選擇符+段內(nèi)偏移”組成,。 線性地址:邏輯地址經(jīng)分段機(jī)制后就成線性地址,,它是平坦的;如果不啟用分頁,,那么此線性地址即物理地址,。 物理地址:線性地址經(jīng)分頁轉(zhuǎn)換后就成了物理地址。 實(shí)模式尋址方式剛才說了8086CPU數(shù)據(jù)總線為16位,,也就是一次最多能取2^16=64KB數(shù)據(jù),,這個(gè)數(shù)據(jù)也解釋了實(shí)模式下為什么每個(gè)段最大只有64KB。但剛才還說了其地址總線為20位,這樣它能尋址的能力其實(shí)是2^20=1MB,,這也就是實(shí)模式下CPU的最大尋址能力,。既然它有1MB尋址能力,那怎么用16位的段寄存器表示呢,? 這就引出了分段的概念,,8086CPU將1MB存儲(chǔ)空間分成許多邏輯段,每個(gè)段最大限長(zhǎng)為64KB(但不一定就是64KB),。這樣每個(gè)存儲(chǔ)單元就可以用“段基地址+段內(nèi)偏移地址”表示,。段基地址由16位段寄存器值左移4位表達(dá),段內(nèi)偏移表示相對(duì)于某個(gè)段起始位置的偏移量,。比如: SEG=0x07c0 jmpi offset, #SEG offset: mov ax,cs 保護(hù)模式尋址方式在定義“邏輯地址”時(shí)看到保護(hù)模式和實(shí)模式的區(qū)別在于它是用段選擇符而非段基地址,,這也許就是保護(hù)模式的真諦所在,從段選擇符入手,,全面理解保護(hù)模式編程基本概念和尋址方式,。 分段機(jī)制下面來看下保護(hù)模式是怎樣通過“段選擇符+段內(nèi)偏移”尋址最終的線性地址或物理地址的。 圖1 邏輯地址到線性地址轉(zhuǎn)換,,這里的邏輯地址即指保護(hù)模式下的“段選擇符+段內(nèi)偏移地址”,,如果不啟用分頁管理的情況下,那么此線性地址即最終的物理地址,。 圖1 邏輯地址到線性地址轉(zhuǎn)換 在理解此圖時(shí)必須要明白段選擇符結(jié)構(gòu),、描述符表概念等,下面就一一介紹,。 如圖2段選擇符結(jié)構(gòu),,段選擇符為16位,它不直接指向段,,而是通過指向的段描述符,,段描述符(一會(huì)介紹)再定義段的信息。 圖2 段選擇符結(jié)構(gòu) 其中TI用來指明全局描述符表GDT還是局部描述符表LDT,,RPL表示請(qǐng)求特權(quán)級(jí),,索引值為13位,所以從這里看出,,在保護(hù)模式下最多可以表示2^13=8192個(gè)段描述符,,而TI又分GDT和LDT(如圖3所示),所以一共可以表示8192*2=16384個(gè)段描述符,,每個(gè)段描述符可以指定一個(gè)具體的段信息,,所以一共可以表示16384個(gè)段。而圖1看出,,段內(nèi)偏移地址為32位值,,所以一個(gè)段最大可達(dá)4GB,,這樣16384*4GB=64TB,這就是所謂的64TB最大尋址能力,,也即邏輯地址/虛擬地址,。 在保護(hù)模式實(shí)際編程中,如下一條語句:jmpi 0, 8,。其中的8即段選擇符,8的二進(jìn)制表示為:0000 0000 0000 1000b,,所以這條語句的意思是跳轉(zhuǎn)到GDT表(TI=0)中的第2個(gè)(段描述符表從0開始編號(hào),,所以這里的1指表中的第2個(gè))段描述符定義的段中,其段內(nèi)偏移為0,。 圖3 下面再來看段描述符結(jié)構(gòu),,段描述符表中的每一項(xiàng)為一個(gè)段描述符,每一項(xiàng)為8字節(jié),,其結(jié)構(gòu)如圖4所示,。 從圖中可知,段選擇符指向的段描述符里有三個(gè)部分基地址信息,,這三部分組成一個(gè)32位地址就決定了段基地址位置,,此地址再加上段內(nèi)偏移最終確定線性地址位置。 段描述符中的S位和TYPE字段(四位)的不同又分為數(shù)據(jù)段描述符,、代碼段描述符(S=1)和系統(tǒng)段描述符(S=1),。數(shù)據(jù)段和代碼段描述符類型如圖5所示。 圖5 系統(tǒng)段描述符如圖6所示,。 圖6 分頁機(jī)制到目前為止我們知道了保護(hù)模式下是怎樣通過段選擇符指向一個(gè)段描述符,,最終由段描述符+段內(nèi)偏移定位線性地址,在不啟用分頁情況下,,此線性地址就是物理地址,,那么在啟用分頁情況下,又是怎樣實(shí)現(xiàn)內(nèi)存的映射轉(zhuǎn)換的呢,?這就是偉大的分頁機(jī)制,。 分頁機(jī)制如下圖所示,它把物理內(nèi)存分成相同固定大小的頁面,,2^12=4KB,。每個(gè)頁面的0~4KB范圍由線性地址的低12位表示,線性地址空間的高10位用來指定頁目錄中的位置,,可以選擇2^10=1024個(gè)目錄項(xiàng),,每個(gè)目錄項(xiàng)為四字節(jié),所以頁目錄為1024*4B=4KB,。每個(gè)目錄項(xiàng)中的高20位用以查找頁表在物理內(nèi)存中的頁面,,每個(gè)頁表含1024個(gè)頁表項(xiàng),每個(gè)頁表項(xiàng)也是四字節(jié),這樣一頁表也是1024*4B=4KB,。所以一個(gè)頁目錄可以查找1024個(gè)頁表,,每個(gè)頁表為4KB,所以總共可以查找的頁表大小為1024*4KB=4MB大,。最后每個(gè)頁表項(xiàng)的高20位用以定位物理地址空間中的某個(gè)頁基地址,,此地址再加上線性地址空間的偏移值就是最后物理內(nèi)存空間單元。目錄項(xiàng)和頁表項(xiàng)結(jié)構(gòu)如圖8所示,。 圖7分頁機(jī)制 圖8 從一個(gè)邏輯地址經(jīng)過分段和分頁尋址物理地址的整個(gè)過程就如圖9所示,。總的來說整個(gè)過就是邏輯地址經(jīng)分段機(jī)制變成線性地址,,如果不啟用分頁的情況下,,此線性地址就是物理地址;如果啟用分頁,,那么線性地址經(jīng)分頁機(jī)制變成物理地址,。 圖9分段和分頁 分段和分頁的意義說了半天分段和分頁的原理,它們到底有何用,?這里以保護(hù)模式下分段和分頁講解,。 圖10 多段模型 如圖10所示。一個(gè)多段模型充分發(fā)揮了段機(jī)制的對(duì)代碼,、數(shù)據(jù)結(jié)構(gòu)和程序提供硬件保護(hù)的能力,。每個(gè)程序都有自己的段描述符表和自己的段。段可以完全屬于程序私有也可以和其它程序之間共享,。 訪問權(quán)限的檢查不僅僅用來保護(hù)地址越界,,也可以保護(hù)某一特定段不允許操作。例如代碼段是只讀段,,硬件可以阻擊向代碼段進(jìn)行寫操作,。 分頁為需求頁、虛擬內(nèi)存提供實(shí)現(xiàn)機(jī)制,。具體的實(shí)現(xiàn)機(jī)制可以再深入學(xué)習(xí),。 文獻(xiàn)資料《深入理解Linux內(nèi)核》 《Linux內(nèi)核完全剖析》趙炯 《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》 《Linux內(nèi)核修煉之道》 《新版匯編語言程序設(shè)計(jì)》錢曉捷著 《windows環(huán)境下32位匯編語言程序設(shè)計(jì)》羅云彬著 |
|