http://blog.chinaunix.net/uid-27164517-id-3282863.html
2012
分頁(yè)就是將進(jìn)程的邏輯地址空間分成若干大小相等的片(即頁(yè)),然后裝入內存。 分段就是用戶(hù)可以把自己的作業(yè)按邏輯關(guān)系劃分為若干個(gè)段,每個(gè)段都是從0開(kāi)始編址,并有自己的名字和長(cháng)度。這就相當于程序里邊的主函數段、各個(gè)子函數段、數據段、棧段等等。 要知道在引入分頁(yè)和分段之前,是通過(guò)連續分配方式來(lái)管理存儲器的,就是說(shuō)一個(gè)進(jìn)程在內存中是連續存放的。 可以這樣理解吧,內存中有進(jìn)程1、2、3……進(jìn)程2先執行完成了,然后釋放了所占有的內存空間,而之后, 如果新調入的進(jìn)程內存需求大于之前2所占有的內存空間,那么不可能利用這塊內存,相對于內存需求更大的進(jìn)程來(lái)說(shuō),之前2所占有的內存空間就是不能利用的碎片, 如果新調入的進(jìn)程內存需求小于之前2所占有的空間就會(huì )留下空隙,也會(huì )帶來(lái)碎片。 雖然可以通過(guò)“緊湊”的方法進(jìn)行碎片整理,但開(kāi)銷(xiāo)很大這就產(chǎn)生了與連續分配方式相對的離散分配方式,便先后引入了分頁(yè)和分段存儲管理。 所以相同點(diǎn)就是,兩者都屬于存儲器管理方式中的離散分配方式。都要通過(guò)地址映射機構來(lái)實(shí)現地址變換。 不同點(diǎn)就在于,離散分配方式的基本單位的不同,是頁(yè)還是段。 頁(yè)是信息的物理單位,段是信息的邏輯單位。 分頁(yè)的作業(yè)地址空間是一維的,線(xiàn)性的,程序員只需利用一個(gè)記憶符表示一個(gè)地址;而分段的作業(yè)地址空間是二維的,程序員在表示一個(gè)地址的時(shí)候既要給出段名,又需要給出段內陸址。其中,段名可以理解為函數名等,段內陸址可以理解程變量等的地址。 值得一提的是其中頁(yè)的大小要和物理塊或者頁(yè)框一樣,而物理塊是操作系統定好了的。也就是說(shuō)你的操作系統裝完之后,物理塊的大小是定了的,從而頁(yè)的大小也是定了的。而段的長(cháng)度是不定的。 引入分頁(yè)存儲管理方式的目的是提高內存利用率,而引入分段存儲是為了滿(mǎn)足用戶(hù)(程序員)在編程和使用上多方面上的要求。還有將兩者結合一起的段頁(yè)式系統。
一,linux繞過(guò)了段機制而主要采用了頁(yè)機制實(shí)現內存管理。原因如下:
1,為了使得內存管理變得簡(jiǎn)單,繞過(guò)了段機制,虛擬地址=線(xiàn)性地址。
2,為了方便移植到多個(gè)硬件平臺,因為很多RISC處理器不支持段機制。
----------------------------------------------------------------------------------------------
二,進(jìn)程的地址空間。
linux下每個(gè)進(jìn)程都有4GB的地址空間=1GB的內核空間 + 3GB的用戶(hù)空間
1,進(jìn)程切換時(shí),虛擬地址空間也隨之切換。唯有3GB的用戶(hù)空間切換,1GB的內核空間
是所用進(jìn)程共享的,常駐內存。
2,虛擬地址空間切換,頁(yè)表也隨之切換。
----------------------------------------------------------------------------------------------
三,虛擬地址映射到物理地址。
地址映射應該分兩部分分析,內核空間和用戶(hù)空間。
內核空間使用的是線(xiàn)性映射,很好理解。
用戶(hù)空間使用的是頁(yè)表來(lái)映射。
---------------------------------------------------------------------------------------------
3.1,內核空間的地址映射到物理地址空間。
內核空間地址映射函數如下:
- #define __va(x) ((void *)((unsigned long)(x) PAGE_OFFSET)) // 虛擬地址 = 物理地址x 3GB
- #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) //物理地址 = 虛擬地址x - 3GB
----------------------------------------------------------------------------------------------
3.2,用戶(hù)空間映射到物理地址空間。
linux 采用了三級頁(yè)表,實(shí)際上linux可以通過(guò)啟用或禁用中間目錄來(lái)啟用兩級和
三級分頁(yè)(使用相同的代碼),在32位的x86體系上就用的兩級頁(yè)表。
----------------------------------------------------------------------------------------------
先以?xún)杉夗?yè)表說(shuō)說(shuō)虛擬地址是如何映射成為物理地址的吧。
進(jìn)程切換,首先是從新的進(jìn)程的PCB中讀出pgd,然后寫(xiě)入CR3中,cr3 = __pa(pgd)
CR3相當于頁(yè)表的根所在,CR3中存放的是頁(yè)目錄的基址,該基址 偏移量(線(xiàn)性地址的前10位)
= 頁(yè)表的基址,頁(yè)表的基址 偏移量(線(xiàn)性地址的中間10位)=物理頁(yè)的基址,物理頁(yè)的基址
偏移量 = 物理地址。
下面小結物理地址的計算:
- cr3 Page Directory (10 MSB) = 指向 table_base
- table_base Page Table (10 中間位) = 指向 page_base
- page_base Offset = 物理地址 (獲得頁(yè)框)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。