物理地址邏輯地址虛擬地址的概念_第1頁
物理地址邏輯地址虛擬地址的概念_第2頁
物理地址邏輯地址虛擬地址的概念_第3頁
物理地址邏輯地址虛擬地址的概念_第4頁
物理地址邏輯地址虛擬地址的概念_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一概念物理地址(physical address)用于內(nèi)存芯片級的單元尋址,與處理器和 CPU連接的地址總線相對應(yīng).這個概念應(yīng)該是這幾個概念中最好理解的一個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那 根內(nèi)存本身,把內(nèi)存看成一個從 0字節(jié)一直到最大空量逐字節(jié)的編號的大數(shù)組,然后把這個數(shù)組叫做物理地址,但是事 實上,這只是一個硬件提供應(yīng)軟件的抽像,內(nèi)存的尋址方式并不是這樣.所以,說它是與地址總線相對應(yīng)工是更貼切一些,不過拋開對物理內(nèi)存尋址方式的考慮,直接把物理地址與物理的內(nèi)存一一對應(yīng),也是可以接受的.也許錯誤的理 解更利于形而上的抽像.虛擬內(nèi)存(virtual memory)這是

2、對整個內(nèi)存(不要與機器上插那條對上號) 的抽像描述.它是相對于物理內(nèi)存來講的,可以直接理解成 不直實的, 假的內(nèi)存,例如,一個0x08000000 內(nèi)存地址,它并不對就物理地址上那個大數(shù)組中 0x08000000 - 1 那個地址元素;之所以是這樣,是由于現(xiàn)代操作系統(tǒng)都提供了一種內(nèi)存治理的抽像,即虛擬內(nèi)存( virtual memory ).進程使用虛擬 內(nèi)存中的地址,由操作系統(tǒng)協(xié)助相關(guān)硬件,把它轉(zhuǎn)換成真正的物理地址.這個 轉(zhuǎn)換,是所有問題討論的關(guān)鍵.有了這樣的抽像,一個程序,就可以使用比真實物理地址大得多的地址空間.(拆東墻,補西墻,銀行也是這樣子做的),甚至多個進程可以使用相同的地址.不奇

3、怪,由于轉(zhuǎn)換后的物理地址并非相同的.可以把連接后的程序反編譯看一下,發(fā)現(xiàn)連接器已經(jīng)為程序分配了一個地址,例如,要調(diào)用某個函數(shù)A,代碼不是call A ,而是call 0x0811111111 ,也就是說,函數(shù)A的地址已經(jīng)被定下來了.沒有這樣的 轉(zhuǎn)換,沒有虛擬地址的 概念,這樣做是根本行不通的.打住了,這個問題再說下去,就收不住了.邏輯地址(logical address)Intel為了兼容,將遠古時代的段式內(nèi)存治理方式保存了下來.邏輯地址指的是機器語言指令中,用來指定一個操作數(shù) 或者是一條指令的地址.以上例,我們說的連接器為A分配的0x08111111 這個地址就是邏輯地址.不過不好意思,這樣

4、說,好似又違背了 Intel中段式治理中,對邏輯地址要求,個邏輯地址,是由一個段標(biāo)識符加上一個指定段內(nèi)相對地址的偏移量,表示為段標(biāo)識符:段內(nèi)偏移量,也就是說,上例中那個0x08111111 ,應(yīng)該表示為A的代碼段標(biāo)識符:0x08111111,這樣,才完整一些線性地址(linear address)或也叫虛擬地址(virtual address)跟邏輯地址類似,它也是一個不真實的地址,如果邏輯地址是對應(yīng)的硬件平臺段式治理轉(zhuǎn)換前地址的話,那么線性地址 那么對應(yīng)了硬件頁式內(nèi)存的轉(zhuǎn)換前地址.CPU將一個虛擬內(nèi)存空間中的地址轉(zhuǎn)換為物理地址,需要進行兩步:首先將給定一個邏輯地址(其實是段內(nèi)偏移量,這 個一

5、定要理解! ! !),CPU要利用其段式內(nèi)存治理單元,先將為個邏輯地址轉(zhuǎn)換成一個線程地址,再利用其頁式內(nèi)存 治理單元,轉(zhuǎn)換為最終物理地址.這樣做兩次轉(zhuǎn)換,確實是非常麻煩而且沒有必要的,由于直接可以把線性地址抽像給進程.之所以這樣冗余,Intel完全是為了兼容而已.2、CPU段式內(nèi)存治理,邏輯地址如何轉(zhuǎn)換為線性地 址一個邏輯地址由兩部份組成,段標(biāo)識符:段內(nèi)偏移量.段標(biāo)識符是由一個16位長的字段組成,稱為段選擇符.其中前 13位是一個索引號.后面3位包含一些硬件細節(jié),如圖:段選擇符153 2 10索引號 TI帆TI二式指片器RH=請求者特權(quán)祓最后兩位涉及權(quán)限檢查,本貼中不包含.索引號,或者直接理解

6、成數(shù)組下標(biāo) 一一那它總要對應(yīng)一個數(shù)組吧,它又是什么東東的索引呢?這個東東就是 段描述符 (segment descriptor) ,呵呵,段描述符具體地址描述了一個段(對于段這個字眼的理解,我是把它想像成,拿了一把刀,把虛擬內(nèi)存,砍成假設(shè)干的截 一一段).這樣,很多個段描述符,就組了一個數(shù)組,叫段描述符表,這樣,可以通過段標(biāo)識符的前13位,直接在段描述符表中找到一個具體的段描述符,這個描述符就描述了一個段,我剛剛對段 的抽像不太準(zhǔn)確,由于看看描述符里面究竟有什么東東 一一也就是它究竟是如何描述的,就理解段究竟有什么東東了, 每一個段描述符由8個字節(jié)組成,如下列圖:敷搦陵描述符63泡第NM 57

7、訪55 54 53 52 51 5Q 49加,曲蛤44的取41 40碼兌37憑35 34 53犯A umit D 5 .明陽彈31)G B 0 V 譚曲 1 P =T冊0ASE(16 23)明SE 什啕LIMIT 15)JT jo 29 畝方選 zs n 2.757575"居百"值 i it io 1 a " "TT $ i 21 0代碼段描述符63版61的博用57詔苣以S3 52 51訕相槍47布跖射口要41和的38辭書吟34黨32A UMIT D SBASE(24-31) G D 0 V | 好酒 1 P = TYPE BASE (16-23)BAS

8、E阿司出冊恒5)31 3Q 29 23 27 孤 25 24 23 支 21 20 19 用 17 16 15 H 13 12 11 10 f I 7 I 5 4 3 2 1 0系統(tǒng)段描述符6351的沿冏 57 56 鉆 54 52 51 5.49 死5托 45 44 43 42 4M0 35 3S 17 3C 弋加* 3:BASE(加制G 0 松% 1 P ! TYPE鄧SE06 到BASE小15)UMIT(M5)3I 30 293北爸因竹為 2 2.您 18 17 16 15 14 T3 12 It l7 9 8 6 4 3 T !7這些東東很復(fù)雜,雖然可以利用一個數(shù)據(jù)結(jié)構(gòu)來定義它,不過,

9、我這里只關(guān)心一樣,就是 Base字段,它描述了一個段的開始位置的線性地址.Intel設(shè)計的本意是,一些全局的段描述符,就放在全局段描述符表GDT中,一些局部的,例如每個進程自己的,就放在所謂的局部段描述符表LDT中.那究竟什么時候該用GDT,什么時候該用LDT呢?這是由段選擇符中的T1 字段表示的,=0 ,表示用GDT, =1表示用LDT.GDT在內(nèi)存中的地址和大小存放在 CPU的gdtr限制存放器中,而LDT那么在ldtr存放器中好多概念,像繞口令一樣.這張圖看起來要直觀些:首先,給定一個完整的邏輯地址段選擇符:段內(nèi)偏移地址,1、看段選擇符的T1=0還是1,知道當(dāng)前要轉(zhuǎn)換是GDT中的段,還是

10、LDT中的段,再根據(jù)相應(yīng)存放器,得到其地址 和大小.我們就有了一個數(shù)組了.2、拿出段選擇符中前13位,可以在這個數(shù)組中,查找到對應(yīng)的段描述符,這樣,它了 Base ,即基地址就知道了.3、把Base + offset ,就是要轉(zhuǎn)換的線性地址了.還是挺簡單的,對于軟件來講,原那么上就需要把硬件轉(zhuǎn)換所需的信息準(zhǔn)備好,就可以讓硬件來完成這個轉(zhuǎn)換了.OK,來看看Linux怎么做的.3、Linux的段式治理Intel要求兩次轉(zhuǎn)換,這樣雖說是兼容了,但是卻是很冗余,呵呵,沒方法,硬件要求這樣做了,軟件就只能照辦,怎 么著也得形式主義一樣.另一方面,其它某些硬件平臺,沒有二次轉(zhuǎn)換的概念,Linux也需要提供

11、一個高層抽像,來提供一個統(tǒng)一的界面.所以,Linux的段式治理,事實上只是哄騙了一下硬件而已.根據(jù)Intel的本意,全局的用GDT,每個進程自己的用LDT 不過Linux那么對所有的進程都使用了相同的段來對指 令和數(shù)據(jù)尋址.即用戶數(shù)據(jù)段,用戶代碼段,對應(yīng)的,內(nèi)核中的是內(nèi)核數(shù)據(jù)段和內(nèi)核代碼段.這樣做沒有什么奇怪的,本來就是走形式嘛,像我們寫年終總結(jié)一樣.include/asm-i386/segment.hCopy to clipboard-CODE:# define GDT_ENTRY_DEFAULT_USER_CS14# define _USER_CS (GDT_ENTRY_DEFAULT_U

12、SER_CS * 8 + 3)# define GDT_ENTRY_DEFAULT_USER_DS15# define _USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3)# define GDT_ENTRY_KERNEL_BASE 12# define GDT_ENTRY_KERNEL_CS(GDT_ENTRY_KERNEL_BASE + 0)# define _KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)# define GDT_ENTRY_KERNEL_DS(GDT_ENTRY_KERNEL_BASE + 1)#define

13、_KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)把其中的宏替換成數(shù)值,那么為:Copy to clipboard-CODE:#define _USER_CS 11500000000 1110 0 11#define _USER_DS 12300000000 1111 0 11#define _KERNEL_CS 9600000000 1100 0 00#define _KERNEL_DS 10400000000 1101 0 00方括號后是這四個段選擇符的16位二制表示,它們的索引號和 T1字段值也可以算出來了Copy to clipboard-CODE:USER_CS

14、index= 14T1=0USER_DSindex= 15T1=0KERNEL_CSindex= 12T1=0KERNELDSindex= 13T1=0T1均為0,那么表示都使用了 GDT,再來看初始化GDT的內(nèi)容中相應(yīng)的12-15項(arch/i386/head.S)CODE:.quad 0x00cf9a000000ffff.quad 0x00cf92000000ffff.quad 0x00cffa000000ffff.quad 0x00cff2000000ffffCopy to clipboard-/* 0x60 kernel 4GB code at 0x00000000 */* 0x68

15、 kernel 4GB data at 0x00000000 */* 0x73 user 4GB code at 0x00000000 */* 0x7 b user 4GB data at 0x00000000 */根據(jù)前面段描述符表中的描述,可以把它們展開,發(fā)現(xiàn)其 16-31位全為0,即四個段的基地址全為0這樣,給定一個段內(nèi)偏移地址,根據(jù)前面轉(zhuǎn)換公式,0 +段內(nèi)偏移,轉(zhuǎn)換為線性地址,可以得出重要的結(jié)論, 在Linux 下,邏輯地址與線性地址總是一致是一致,不是有些人說的相同的,即邏輯地址的偏移量字段的值與線性地址的值 總是相同的.! ! ! 忽略了太多的細節(jié),例如段的權(quán)限檢查.呵呵.Linu

16、x中,絕大部份進程并不例用 LDT,除非使用 Wine ,仿真Windows程序的時候.4 .CPU的頁式內(nèi)存治理CPU的頁式內(nèi)存治理單元,負責(zé)把一個線性地址,最終譯為一個物理地址.從治理和效率的角度出發(fā),線性地址被分 為以固定長度為單位的組,稱為頁page,例如一個32位的機器,線性地址最大可為4G,可以用4KB為一個頁來劃 分,這頁,整個線性地址就被劃分為一個 tatol_page2A20的大數(shù)組,共有2的20個次方個頁.這個大數(shù)組我們稱之為頁目錄.目錄中的每一個目錄項,就是一個地址 一一對應(yīng)的頁的地址.另一類頁,我們稱之為物理頁,或者是頁框、頁楨的.是分頁單元把所有的物理內(nèi)存也劃分為固定

17、長度的治理單位, 它的長度一般與內(nèi)存頁是一一對應(yīng)的.這里注意到,這個total_page 數(shù)組有2A20個成員,每個成員是一個地址32位機,一個地址也就是4字節(jié),那 么要單單要表示這么一個數(shù)組,就要占去 4MB的內(nèi)存空間.為了節(jié)省空間,引入了一個二級治理模式的機器來組織分 頁單元.文字描述太累,看圖直觀一些:如上圖,1、分頁單元中,頁目錄是唯一的,它的地址放在 CPU的cr3存放器中,是進行地址轉(zhuǎn)換的開始點.萬里長征就從此長 始了.2、每一個活動的進程,由于都有其獨立的對應(yīng)的虛似內(nèi)存頁目錄也是唯一的,那么它也對應(yīng)了一個獨立的頁目錄 地址.一一運行一個進程,需要將它的頁目錄地址放到 cr3存放器

18、中,將別個的保存下來.3、每一個32位的線性地址被劃分為三部份,面目錄索引10位:頁表索引10位:偏移12位依據(jù)以下步驟進行轉(zhuǎn)換:1、從cr3中取出進程的頁目錄地址操作系統(tǒng)負責(zé)在調(diào)度進程的時候,把這個地址裝入對應(yīng)存放器;2、根據(jù)線性地址前十位,在數(shù)組中,找到對應(yīng)的索引項,由于引入了二級治理模式,頁目錄中的項,不再是頁的地址,而是一個頁表的地址.又引入了一個數(shù)組,頁的地址被放到頁表中去了.3、根據(jù)線性地址的中間十位,在頁表也是數(shù)組中找到頁的起始地址;4、將頁的起始地址與線性地址中最后 12位相加,得到最終我們想要的葫蘆;這個轉(zhuǎn)換過程,應(yīng)該說還是非常簡單地.全部由硬件完成,雖然多了一道手續(xù),但是節(jié)

19、約了大量的內(nèi)存,還是值得的.那么再簡單地驗證一下:1、這樣的二級模式是否仍能夠表示 4G的地址;頁目錄共有:2A10項,也就是說有這么多個頁表每個目表對應(yīng)了: 2A10頁;每個頁中可尋址:2A12個字節(jié).還是 2A32 = 4GB2、這樣的二級模式是否真的節(jié)約了空間;也就是算一下頁目錄項和頁表項共占空間 2人10 * 4 + 2 A10 *4 = 8KB.哎,怎么說呢! ! !紅色錯誤,標(biāo)注一下,后文貼中有此討論.值得一提的是,雖然頁目錄和頁表中的項,都是 4個字節(jié),32位,但是它們都只用高20位,低12位屏蔽為0 把 頁表的低12屏蔽為0,是很好理解的,由于這樣,它剛好和一個頁面大小對應(yīng)起來

20、,大家都成整數(shù)增加.計算起來就 方便多了.但是,為什么同時也要把頁目錄低 12位屏蔽掉呢?由于按同樣的道理,只要屏蔽其低 10位就可以了,不 過我想,由于12>10 ,這樣,可以讓頁目錄和頁表使用相同的數(shù)據(jù)結(jié)構(gòu),方便.本貼只介紹一般性轉(zhuǎn)換的原理,擴展分頁、頁的保護機制、PAE模式的分頁這些麻煩點的東東就不啰嗦了 可以參考其它專業(yè)書籍.5 .Linux的頁式內(nèi)存治理原理上來講,Linux只需要為每個進程分配好所需數(shù)據(jù)結(jié)構(gòu),放到內(nèi)存中,然后在調(diào)度進程的時候,切換存放器cr3 ,剩下的就交給硬件來完成了呵呵,事實上要復(fù)雜得多,不過偶只分析最根本的流程.前面說了 i386的二級頁治理架構(gòu),不過有

21、些 CPU,還有三級,甚至四級架構(gòu),Linux為了在更高層次提供抽像,為每 個CPU提供統(tǒng)一的界面.提供了一個四層頁治理架構(gòu),來兼容這些二級、三級、四級治理架構(gòu)的 CPU.這四級分別為:頁全局目錄PGD 對應(yīng)剛剛的頁目錄頁上級目錄PUD 新引進的頁中間目錄PMD 也就新引進的 頁表PT 對應(yīng)剛剛的頁表.整個轉(zhuǎn)換依據(jù)硬件轉(zhuǎn)換原理,只是多了二次數(shù)組的索引罷了,如下列圖:那么,對于使用二級治理架構(gòu) 32位的硬件,現(xiàn)在又是四級轉(zhuǎn)換了,它們怎么能夠協(xié)調(diào)地工作起來呢?嗯,來看這種情 況下,怎么來劃分線性地址吧!從硬件的角度,32位地址被分成了三部份一一也就是說,不治理軟件怎么做,最終落實到硬件,也只熟悉這三位老大.從軟件的角度,由于多引入了兩部份,也就是說,共有五部份.一一要讓二層架構(gòu)的硬件熟悉五部份也很容易,在地址劃分的時候,將頁上級目錄和頁中間目錄的長度設(shè)置為0就可以了.這樣,操作系統(tǒng)見到的是五部份,硬件還是按它死板的三部份劃分,也不會出錯,也就是說大家共建了和諧計算機系統(tǒng).這樣,

溫馨提示

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

評論

0/150

提交評論