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

下載本文檔

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

文檔簡(jiǎn)介

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

2、 memory)這是對(duì)整個(gè)內(nèi)存 (不要與機(jī)器上插那條對(duì)上號(hào)) 的抽像描述。它是相對(duì)于物理內(nèi)存來(lái)講的,可以直接理解成 “不直實(shí)的 ”, “假的”內(nèi)存,例如,一個(gè) 0x08000000 內(nèi)存地址,它并不對(duì)就物理地址上那個(gè)大數(shù)組中 0x08000000 - 1 那個(gè)地址元 素; 之所以是這樣,是因?yàn)楝F(xiàn)代操作系統(tǒng)都提供了一種內(nèi)存管理的抽像,即虛擬內(nèi)存( virtual memory )。進(jìn)程使用虛擬 內(nèi)存中的地址,由操作系統(tǒng)協(xié)助相關(guān)硬件,把它 “轉(zhuǎn)換 ”成真正的物理地址。這個(gè) “轉(zhuǎn)換 ”,是所有問(wèn)題討論的關(guān)鍵。 有了這樣的抽像, 一個(gè)程序,就可以使用比真實(shí)物理地址大得多的地址空間。 (拆東墻,補(bǔ)西墻,

3、銀行也是這樣子做的) , 甚至多個(gè)進(jìn)程可以使用相同的地址。不奇怪,因?yàn)檗D(zhuǎn)換后的物理地址并非相同的。可以把連接后的程序反編譯看一下,發(fā)現(xiàn)連接器已經(jīng)為程序分配了一個(gè)地址,例如,要調(diào)用某個(gè)函數(shù) A,代碼不是 call A ,而是 call 0x0811111111 ,也就是說(shuō),函數(shù) A 的地址已經(jīng)被定下來(lái)了。沒(méi)有這樣的 “轉(zhuǎn)換”,沒(méi)有虛擬地址的 概念,這樣做是根本行不通的。打住了,這個(gè)問(wèn)題再說(shuō)下去,就收不住了。邏輯地址 (logical address)Intel 為了兼容,將遠(yuǎn)古時(shí)代的段式內(nèi)存管理方式保留了下來(lái)。邏輯地址指的是機(jī)器語(yǔ)言指令中,用來(lái)指定一個(gè)操作數(shù)或者是一條指令的地址。以上例,我們說(shuō)的

4、連接器為 A分配的0x08111111 這個(gè)地址就是邏輯地址。不過(guò)不好意思,這樣說(shuō),好像又違背了 Intel中段式管理中,對(duì)邏輯地址要求, 一個(gè)邏輯地址,是由一個(gè)段標(biāo)識(shí)符 加上一個(gè)指定段內(nèi)相對(duì)地址的偏移量,表示為 段標(biāo)識(shí)符:段內(nèi)偏移量 ,也就是說(shuō),上例中那個(gè) 0x08111111 ,應(yīng)該 表示為 A 的代碼段標(biāo)識(shí)符 : 0x08111111 ,這樣,才完整一些 ”線性地址 (linear address) 或也叫虛擬地址 (virtual address)跟邏輯地址類似,它也是一個(gè)不真實(shí)的地址,如果邏輯地址是對(duì)應(yīng)的硬件平臺(tái)段式管理轉(zhuǎn)換前地址的話,那么線性地址 則對(duì)應(yīng)了硬件頁(yè)式內(nèi)存的轉(zhuǎn)換前地址。

5、CPU 將一個(gè)虛擬內(nèi)存空間中的地址轉(zhuǎn)換為物理地址,需要進(jìn)行兩步:首先將給定一個(gè)邏輯地址(其實(shí)是段內(nèi)偏移量,這 個(gè)一定要理解!), CPU 要利用其段式內(nèi)存管理單元,先將為個(gè)邏輯地址轉(zhuǎn)換成一個(gè)線程地址,再利用其頁(yè)式內(nèi)存 管理單元,轉(zhuǎn)換為最終物理地址。Intel 完這樣做兩次轉(zhuǎn)換,的確是非常麻煩而且沒(méi)有必要的,因?yàn)橹苯涌梢园丫€性地址抽像給進(jìn)程。之所以這樣冗余, 全是為了兼容而已。2、CPU段式內(nèi)存管理,邏輯地址如何轉(zhuǎn)換為線性地一個(gè)邏輯地址由兩部份組成,段標(biāo)識(shí)符:段內(nèi)偏移量。段標(biāo)識(shí)符是由一個(gè)16位長(zhǎng)的字段組成,稱為段選擇符。其中前13位是一個(gè)索引號(hào)。后面3位包含一些硬件細(xì)節(jié),如圖:15321 0段選

6、擇符索引號(hào)II楓表指示器RPt= i育求苕持權(quán)級(jí)最后兩位涉及權(quán)限檢查,本貼中不包含。索引號(hào),或者直接理解成數(shù)組下標(biāo) 一一那它總要對(duì)應(yīng)一個(gè)數(shù)組吧,它又是什么東東的索引呢?這個(gè)東東就是段描述符(segment descriptor),呵呵,段描述符具體地址描述了一個(gè)段(對(duì)于段這個(gè)字眼的理解,我是把它想像成,拿了一把刀,把虛擬內(nèi)存,砍成若干的截 一一段)。這樣,很多個(gè)段描述符,就組了一個(gè)數(shù)組,叫段描述符表”,這樣,可以通過(guò)段標(biāo)識(shí)符的前13位,直接在段描述符表中找到一個(gè)具體的段描述符,這個(gè)描述符就描述了一個(gè)段,我剛才對(duì)段 的抽像不太準(zhǔn)確,因?yàn)榭纯疵枋龇锩婢烤褂惺裁礀|東一一也就是它究竟是如何描述的,就

7、理解段究竟有什么東東了, 每一個(gè)段描述符由8個(gè)字節(jié)組成,如下圖:刃&260迢必57希55駅53迅引涓49帕尸箱菇4君宅41軸35関盯弼J5 34 S3 328ASE(24-31)GB0LIMIT (16-19)11s=TYPE0ASE(16 23)&ASEM5jUMITIQ31 30 2927 26 2S 2 23 22 21 20 19 1$ 17 16 15 14 13 12 B 10 9 8 7 $ 4 3 2 J 0代碼段描述符63 62 &1的迢用57話詁話歸52引更曲幅47並45軸3池胡40的38抑朋每34 S3 32&ASE(24-31|GD0LIMIT (16-19)1STVP

8、EBASE (16-23)BAS呦問(wèn)DMITRIS)31 弭 29 28 27 26 25 21 23 22 21 20 19 1B 17 16 15 14 13 12 II K) 9 8 - 6 5 I 3 2 1_063館附&0 5&用57 56 55嗣S3 52 51汨陽(yáng) 粘打 怕轉(zhuǎn)胡43竝4M0 35 3 17 3 対S3 3?G0UM1 9)19SflTYPEflASE (16-23)BASE 5jUMIT(M5)31 3Q 23 26 27 26 25 24 22 21 20 19 18 17 lfr 15 U 13 12 H 10 9 9 7 6 4 3 2 I 0這些東東很復(fù)雜

9、,雖然可以利用一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)定義它,不過(guò),我這里只關(guān)心一樣,就是Base字段,它描述了一個(gè)段的開(kāi)始位置的線性地址。Intel設(shè)計(jì)的本意是,一些全局的段描述符,就放在全局段描述符表(GDT) ”中,一些局部的,例如每個(gè)進(jìn)程自己的,就放在所謂的局部段描述符表(LDT)”中。那究竟什么時(shí)候該用GDT,什么時(shí)候該用LDT呢?這是由段選擇符中的T1 字段表示的,=0,表示用GDT,=1表示用LDT。GDT在內(nèi)存中的地址和大小存放在 CPU的gdtr控制寄存器中,而LDT則在Idtr寄存器中首先,給定一個(gè)完整的邏輯地址段選擇符:段內(nèi)偏移地址,1、看段選擇符的T仁0還是1,知道當(dāng)前要轉(zhuǎn)換是GDT中的段,還是

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

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

12、CS * 8 + 3)#define GDT_ENTRY_DEFAULT_USER_DS15#define _USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3)#define GDT_ENTRY_KERNEL_BASE12#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 _KERNEL_DS

13、(GDT_ENTRY_KERNEL_DS * 8)把其中的宏替換成數(shù)值,則為:16位二制表示,它們的索引號(hào)和 T1字段值也可以算出來(lái)了Copy to clipboard-CODE:#define _USER_CS 11500000000 1110 0 11#define _USER_DS12300000000 1111 0 11#define _KERNEL_CS 9600000000 1100 0 00#define _KERNEL_DS10400000000 1101 0 00方括號(hào)后是這四個(gè)段選擇符的Copy to clipboard-CODE:USER_CSindex= 14T1=0U

14、SER_DSindex= 15T1=0KERNEL_CSindex= 12T1=0KERNEL DSindex= 13T1=0T1均為0,則表示都使用了 GDT,再來(lái)看初始化GDT的內(nèi)容中相應(yīng)的12-15項(xiàng)(arch/i386/head.S)Copy to clipboard-CODE:.quad 0x00cf9a000000ffff/* 0x60 kernel 4GB code at 0x00000000 */* 0x68 kernel 4GB data at 0x00000000 */.quad 0x00cf92000000ffff.quad OxOOcffaOOOOOOffff/* 0x

15、73 user 4GB code at 0x00000000 */.quad 0x00cff2000000ffff/* 0x7b user 4GB data at 0x00000000 */按照前面段描述符表中的描述,可以把它們展開(kāi),發(fā)現(xiàn)其 16-31位全為0,即四個(gè)段的基地址全為0。這樣,給定一個(gè)段內(nèi)偏移地址,按照前面轉(zhuǎn)換公式,0 +段內(nèi)偏移,轉(zhuǎn)換為線性地址,可以得出重要的結(jié)論,在Linux下,邏輯地址與線性地址總是一致(是一致,不是有些人說(shuō)的相同)的,即邏輯地址的偏移量字段的值與線性地址的值 總是相同的。!”忽略了太多的細(xì)節(jié),例如段的權(quán)限檢查。呵呵。Linux中,絕大部份進(jìn)程并不例用LDT

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

17、般與內(nèi)存頁(yè)是一一對(duì)應(yīng)的。這里注意到,這個(gè)total_page 數(shù)組有2人20個(gè)成員,每個(gè)成員是一個(gè)地址(32位機(jī),一個(gè)地址也就是4字節(jié)),那 么要單單要表示這么一個(gè)數(shù)組,就要占去4MB的內(nèi)存空間。為了節(jié)省空間,引入了一個(gè)二級(jí)管理模式的機(jī)器來(lái)組織分頁(yè)單元。文字描述太累,看圖直觀一些:如上圖,1、分頁(yè)單元中,頁(yè)目錄是唯一的,它的地址放在 CPU的cr3寄存器中,是進(jìn)行地址轉(zhuǎn)換的開(kāi)始點(diǎn)。萬(wàn)里長(zhǎng)征就從此長(zhǎng) 始了。2、每一個(gè)活動(dòng)的進(jìn)程,因?yàn)槎加衅洫?dú)立的對(duì)應(yīng)的虛似內(nèi)存(頁(yè)目錄也是唯一的),那么它也對(duì)應(yīng)了一個(gè)獨(dú)立的頁(yè)目錄地址。一一運(yùn)行一個(gè)進(jìn)程,需要將它的頁(yè)目錄地址放到cr3寄存器中,將別個(gè)的保存下來(lái)。3、

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論