![物理地址邏輯地址虛擬地址的概念_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/4/cce5e956-b071-430e-a24a-1cd8be76fa97/cce5e956-b071-430e-a24a-1cd8be76fa971.gif)
![物理地址邏輯地址虛擬地址的概念_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/4/cce5e956-b071-430e-a24a-1cd8be76fa97/cce5e956-b071-430e-a24a-1cd8be76fa972.gif)
![物理地址邏輯地址虛擬地址的概念_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/4/cce5e956-b071-430e-a24a-1cd8be76fa97/cce5e956-b071-430e-a24a-1cd8be76fa973.gif)
![物理地址邏輯地址虛擬地址的概念_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/4/cce5e956-b071-430e-a24a-1cd8be76fa97/cce5e956-b071-430e-a24a-1cd8be76fa974.gif)
![物理地址邏輯地址虛擬地址的概念_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-8/4/cce5e956-b071-430e-a24a-1cd8be76fa97/cce5e956-b071-430e-a24a-1cd8be76fa975.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、概念物理地址 (physical address)用于內存芯片級的單元尋址,與處理器和 CPU 連接的地址總線相對應。這個概念應該是這幾個概念中最好理解的一個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那 根內存本身,把內存看成一個從 0 字節(jié)一直到最大空量逐字節(jié)的編號的大數組,然后把這個數組叫做物理地址,但是事 實上,這只是一個硬件提供給軟件的抽像,內存的尋址方式并不是這樣。所以,說它是 “與地址總線相對應 ”,是更貼切 一些,不過拋開對物理內存尋址方式的考慮,直接把物理地址與物理的內存一一對應,也是可以接受的。也許錯誤的理 解更利于形而上的抽像。虛擬內存 (virtual
2、 memory)這是對整個內存 (不要與機器上插那條對上號) 的抽像描述。它是相對于物理內存來講的,可以直接理解成 “不直實的 ”, “假的”內存,例如,一個 0x08000000 內存地址,它并不對就物理地址上那個大數組中 0x08000000 - 1 那個地址元 素; 之所以是這樣,是因為現(xiàn)代操作系統(tǒng)都提供了一種內存管理的抽像,即虛擬內存( virtual memory )。進程使用虛擬 內存中的地址,由操作系統(tǒng)協(xié)助相關硬件,把它 “轉換 ”成真正的物理地址。這個 “轉換 ”,是所有問題討論的關鍵。 有了這樣的抽像, 一個程序,就可以使用比真實物理地址大得多的地址空間。 (拆東墻,補西墻,
3、銀行也是這樣子做的) , 甚至多個進程可以使用相同的地址。不奇怪,因為轉換后的物理地址并非相同的。可以把連接后的程序反編譯看一下,發(fā)現(xiàn)連接器已經為程序分配了一個地址,例如,要調用某個函數 A,代碼不是 call A ,而是 call 0x0811111111 ,也就是說,函數 A 的地址已經被定下來了。沒有這樣的 “轉換”,沒有虛擬地址的 概念,這樣做是根本行不通的。打住了,這個問題再說下去,就收不住了。邏輯地址 (logical address)Intel 為了兼容,將遠古時代的段式內存管理方式保留了下來。邏輯地址指的是機器語言指令中,用來指定一個操作數或者是一條指令的地址。以上例,我們說的
4、連接器為 A分配的0x08111111 這個地址就是邏輯地址。不過不好意思,這樣說,好像又違背了 Intel中段式管理中,對邏輯地址要求, 一個邏輯地址,是由一個段標識符 加上一個指定段內相對地址的偏移量,表示為 段標識符:段內偏移量 ,也就是說,上例中那個 0x08111111 ,應該 表示為 A 的代碼段標識符 : 0x08111111 ,這樣,才完整一些 ”線性地址 (linear address) 或也叫虛擬地址 (virtual address)跟邏輯地址類似,它也是一個不真實的地址,如果邏輯地址是對應的硬件平臺段式管理轉換前地址的話,那么線性地址 則對應了硬件頁式內存的轉換前地址。
5、CPU 將一個虛擬內存空間中的地址轉換為物理地址,需要進行兩步:首先將給定一個邏輯地址(其實是段內偏移量,這 個一定要理解!), CPU 要利用其段式內存管理單元,先將為個邏輯地址轉換成一個線程地址,再利用其頁式內存 管理單元,轉換為最終物理地址。Intel 完這樣做兩次轉換,的確是非常麻煩而且沒有必要的,因為直接可以把線性地址抽像給進程。之所以這樣冗余, 全是為了兼容而已。2、CPU段式內存管理,邏輯地址如何轉換為線性地一個邏輯地址由兩部份組成,段標識符:段內偏移量。段標識符是由一個16位長的字段組成,稱為段選擇符。其中前13位是一個索引號。后面3位包含一些硬件細節(jié),如圖:15321 0段選
6、擇符索引號II楓表指示器RPt= i育求苕持權級最后兩位涉及權限檢查,本貼中不包含。索引號,或者直接理解成數組下標 一一那它總要對應一個數組吧,它又是什么東東的索引呢?這個東東就是段描述符(segment descriptor),呵呵,段描述符具體地址描述了一個段(對于段這個字眼的理解,我是把它想像成,拿了一把刀,把虛擬內存,砍成若干的截 一一段)。這樣,很多個段描述符,就組了一個數組,叫段描述符表”,這樣,可以通過段標識符的前13位,直接在段描述符表中找到一個具體的段描述符,這個描述符就描述了一個段,我剛才對段 的抽像不太準確,因為看看描述符里面究竟有什么東東一一也就是它究竟是如何描述的,就
7、理解段究竟有什么東東了, 每一個段描述符由8個字節(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呦問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汨陽 粘打 怕轉胡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這些東東很復雜
9、,雖然可以利用一個數據結構來定義它,不過,我這里只關心一樣,就是Base字段,它描述了一個段的開始位置的線性地址。Intel設計的本意是,一些全局的段描述符,就放在全局段描述符表(GDT) ”中,一些局部的,例如每個進程自己的,就放在所謂的局部段描述符表(LDT)”中。那究竟什么時候該用GDT,什么時候該用LDT呢?這是由段選擇符中的T1 字段表示的,=0,表示用GDT,=1表示用LDT。GDT在內存中的地址和大小存放在 CPU的gdtr控制寄存器中,而LDT則在Idtr寄存器中首先,給定一個完整的邏輯地址段選擇符:段內偏移地址,1、看段選擇符的T仁0還是1,知道當前要轉換是GDT中的段,還是
10、LDT中的段,再根據相應寄存器,得到其地址 和大小。我們就有了一個數組了。2、 拿出段選擇符中前13位,可以在這個數組中,查找到對應的段描述符,這樣,它了Base,即基地址就知道了。3、把Base + offset ,就是要轉換的線性地址了。還是挺簡單的,對于軟件來講,原則上就需要把硬件轉換所需的信息準備好,就可以讓硬件來完成這個轉換了。0K,來看看Linux怎么做的。3、Linux的段式管理Intel要求兩次轉換,這樣雖說是兼容了,但是卻是很冗余,呵呵,沒辦法,硬件要求這樣做了,軟件就只能照辦,怎 么著也得形式主義一樣。另一方面,其它某些硬件平臺,沒有二次轉換的概念,Linux也需要提供一個
11、高層抽像,來提供一個統(tǒng)一的界面。所以,Linux的段式管理,事實上只是哄騙”了一下硬件而已。按照Intel的本意,全局的用GDT,每個進程自己的用LDT不過Linux則對所有的進程都使用了相同的段來對指 令和數據尋址。即用戶數據段,用戶代碼段,對應的,內核中的是內核數據段和內核代碼段。這樣做沒有什么奇怪的, 本來就是走形式嘛,像我們寫年終總結一樣。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)把其中的宏替換成數值,則為:16位二制表示,它們的索引號和 T1字段值也可以算出來了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方括號后是這四個段選擇符的Copy to clipboard-CODE:USER_CSindex= 14T1=0U
14、SER_DSindex= 15T1=0KERNEL_CSindex= 12T1=0KERNEL DSindex= 13T1=0T1均為0,則表示都使用了 GDT,再來看初始化GDT的內容中相應的12-15項(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 */按照前面段描述符表中的描述,可以把它們展開,發(fā)現(xiàn)其 16-31位全為0,即四個段的基地址全為0。這樣,給定一個段內偏移地址,按照前面轉換公式,0 +段內偏移,轉換為線性地址,可以得出重要的結論,在Linux下,邏輯地址與線性地址總是一致(是一致,不是有些人說的相同)的,即邏輯地址的偏移量字段的值與線性地址的值 總是相同的。!”忽略了太多的細節(jié),例如段的權限檢查。呵呵。Linux中,絕大部份進程并不例用LDT
16、,除非使用 Wine,仿真Windows程序的時候。4. CPU的頁式內存管理CPU的頁式內存管理單元,負責把一個線性地址,最終翻譯為一個物理地址。從管理和效率的角度出發(fā),線性地址被分 為以固定長度為單位的組,稱為頁(page),例如一個32位的機器,線性地址最大可為4G ,可以用4KB為一個頁來劃 分,這頁,整個線性地址就被劃分為一個 tatol_page2A20的大數組,共有2的20個次方個頁。這個大數組我們稱之為頁目錄。目錄中的每一個目錄項,就是一個地址一一對應的頁的地址。另一類頁”,我們稱之為物理頁,或者是頁框、頁楨的。是分頁單元把所有的物理內存也劃分為固定長度的管理單位, 它的長度一
17、般與內存頁是一一對應的。這里注意到,這個total_page 數組有2人20個成員,每個成員是一個地址(32位機,一個地址也就是4字節(jié)),那 么要單單要表示這么一個數組,就要占去4MB的內存空間。為了節(jié)省空間,引入了一個二級管理模式的機器來組織分頁單元。文字描述太累,看圖直觀一些:如上圖,1、分頁單元中,頁目錄是唯一的,它的地址放在 CPU的cr3寄存器中,是進行地址轉換的開始點。萬里長征就從此長 始了。2、每一個活動的進程,因為都有其獨立的對應的虛似內存(頁目錄也是唯一的),那么它也對應了一個獨立的頁目錄地址。一一運行一個進程,需要將它的頁目錄地址放到cr3寄存器中,將別個的保存下來。3、
18、每一個32位的線性地址被劃分為三部份,面目錄索引(10位):頁表索引(10位):偏移(12位) 依據以下步驟進行轉換:1、從cr3中取出進程的頁目錄地址(操作系統(tǒng)負責在調度進程的時候,把這個地址裝入對應寄存器);2、根據線性地址前十位,在數組中,找到對應的索引項,因為引入了二級管理模式,頁目錄中的項,不再是頁的地址, 而是一個頁表的地址。(又引入了一個數組),頁的地址被放到頁表中去了。3、根據線性地址的中間十位,在頁表(也是數組)中找到頁的起始地址;4、將頁的起始地址與線性地址中最后 12位相加,得到最終我們想要的葫蘆;這個轉換過程,應該說還是非常簡單地。全部由硬件完成,雖然多了一道手續(xù),但是
19、節(jié)約了大量的內存,還是值得的。那么再簡單地驗證一下:1、這樣的二級模式是否仍能夠表示 4G的地址;頁目錄共有:2X0項,也就是說有這么多個頁表每個目表對應了: 2X0頁;每個頁中可尋址:2A12個字節(jié)。還是 2A32 = 4GB2、這樣的二級模式是否真的節(jié)約了空間;也就是算一下頁目錄項和頁表項共占空間(2X0 * 4 + 2 A10 *4) = 8KB。哎,怎么說呢! !紅色錯誤,標注一下,后文貼中有此討論。值得一提的是,雖然頁目錄和頁表中的項,都是 4個字節(jié),32位,但是它們都只用高20位,低12位屏蔽為0 把 頁表的低12屏蔽為0,是很好理解的,因為這樣,它剛好和一個頁面大小對應起來,大家
20、都成整數增加。計算起來就 方便多了。但是,為什么同時也要把頁目錄低12位屏蔽掉呢?因為按同樣的道理,只要屏蔽其低 10位就可以了,不過我想,因為1210,這樣,可以讓頁目錄和頁表使用相同的數據結構,方便。本貼只介紹一般性轉換的原理,擴展分頁、頁的保護機制、PAE模式的分頁這些麻煩點的東東就不啰嗦了可以參考 其它專業(yè)書籍。5. Li nux的頁式內存管理原理上來講,Linux只需要為每個進程分配好所需數據結構,放到內存中,然后在調度進程的時候,切換寄存器cr3,剩下的就交給硬件來完成了(呵呵,事實上要復雜得多,不過偶只分析最基本的流程)。前面說了 i386的二級頁管理架構,不過有些 CPU,還有
21、三級,甚至四級架構,Linux為了在更高層次提供抽像,為每 個CPU提供統(tǒng)一的界面。提供了一個四層頁管理架構,來兼容這些二級、三級、四級管理架構的 CPU。這四級分別為:頁全局目錄PGD (對應剛才的頁目錄)頁上級目錄PUD (新引進的)頁中間目錄PMD (也就新引進的) 頁表PT (對應剛才的頁表)。整個轉換依據硬件轉換原理,只是多了二次數組的索引罷了,如下圖:線性趙址那么,對于使用二級管理架構 32位的硬件,現(xiàn)在又是四級轉換了,它們怎么能夠協(xié)調地工作起來呢?嗯,來看這種情 況下,怎么來劃分線性地址吧!從硬件的角度,32位地址被分成了三部份一一也就是說,不管理軟件怎么做,最終落實到硬件,也只認識這三位老大。 從軟件的角度,由于多引入了兩部份,也就是說,共有五部份。 要讓二層架構的硬件認識五部份也很容易,在地 址劃分的時候,將頁上級目錄和頁中間目錄的長度設置為 0 就可以了。這樣,操作系統(tǒng)見到的是五部份, 硬件還是按它死板的三部份劃分, 也不會出錯, 也就是說大家共建了和諧計算機系統(tǒng)。 這樣,雖說是多此一舉,但是考
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年岳陽貨運從業(yè)資格考試
- 2025年晉城貨運資格證考試有哪些項目
- 2025年南京貨運資格考試答案
- 2025年天津貨運從業(yè)資格證考試題技巧答案詳解
- 電梯維護保養(yǎng)合同(2篇)
- 電力用戶協(xié)議(2篇)
- 2025年市婦聯(lián)執(zhí)委會議上的工作報告
- 浙教版數學七年級上冊2.5《有理數的乘方》聽評課記錄1
- 徐州報關委托協(xié)議
- 幼兒園后勤總務工作計劃范本
- 暑期預習高一生物必修二知識點
- 醫(yī)院人體器官捐獻及獲取流程
- 結腸造瘺還納手術配合
- 2024年云南省中考物理真題含解析
- 2025年中國艾草行業(yè)市場現(xiàn)狀、發(fā)展概況、未來前景分析報告
- (閩教版)六年級下英語教學計劃
- 人教版英語高考試卷與參考答案(2024年)
- 河砂、碎石生產質量保證措施方案
- 三位數除以兩位數過關練習口算題大全附答案
- 紅樓夢服飾文化
- 湖北省2024年村干部定向考試真題
評論
0/150
提交評論