底層希望段管理,使用者希望頁管理...如何結合呢?
這就引出了虛擬記憶體的概念。
我們設定一種位址空間,稱之為虛擬記憶體,向上,可以為使用者提供段;向下,將段對映到物理幀上。
對使用者來說,是段的使用,對物理記憶體來說,是頁的使用。
定址:使用者給出cs: ip,先查段表,訪問某個段內的東西,得到乙個虛擬位址;然後再查頁表,得到實體地址。
總結:作業系統使用了兩層對映,向上為使用者提供段操作,向下為硬體提供分頁管理
實際的東西:
程式如何載入記憶體?
1.割出段
2.建立段表
3.對映到記憶體
4.建立頁表
5.可以用重定位定址
下面是為父程序copy乙個子程序,在記憶體上的操作:
p是pcb,nr是pcb的號碼,每個人從虛擬記憶體中割出64m空間,作為分給程式的段,將基位址分給pcb的ldt。
以上**完成了1,2兩步。
我們可以發現虛擬位址不重疊,所以對應的頁號不重疊,所以可以共用一套頁表。實際上可能是會有重疊的,所以每個程序都應該要有自己的頁表。
現在要完成二次對映,分頁建立頁表。
共用父程序的記憶體,所以沒有分配記憶體,但有建立頁表的部分。
本來是右移22位,但是得到的只是索引號,具體的位址還要4,因為每項的大小是4,>>224=>>20且右邊兩位清零。
現在要用到新的頁表項,所以要為其分配實際的物理記憶體頁,原先是沒有的,這體現了分級頁表的特點,申請由mem_map完成,注意記憶體是本來就須臾原先程序的。
上面是賦值部分,簡單了。注意小細節,mem_map的值加1,表示引用這塊記憶體的程式+1。
以上完成了步驟3,4。
最後一步:
最後看*p=7是怎麼工作的,實際上是對映都是由硬體部分mmu完成。
OS 李治軍 L22 多級頁表與快表
分頁會有問題,為了提高利用率,頁應該小吧,但這樣頁表項就會增加 到後面就會膨脹得很厲害。例如,4k的頁,4g的物理,那麼就會有4g 4k 4m個頁表項!不僅如此,每個程序的pcb都要儲存乙份頁表。但實際上大部分邏輯位址根本不會用到,能不能把頁表壓縮?第一種嘗試 只存放用到的頁,用到的邏輯頁才有頁表項...
段頁結合的實際記憶體管理 虛擬記憶體 OS
如何讓作業系統既支援段又支援頁?虛擬記憶體 我們讓應用程式分為段,然後對映到一段虛擬記憶體中,再讓虛擬記憶體對映到物理記憶體中的頁中,這樣就完成了段和頁的結合 段 頁同時存在時的重定位 位址翻譯 乙個實際的段 頁式記憶體管理 記憶體管理核心 記憶體分配 使用記憶體分為五步 1.分配段 建段表 for...
OS 李治軍 L28 生磁碟的使用
磁碟具有更複雜的結構,在作業系統內有著更為複雜的抽象層次,這裡的生 raw 是讓disk跑起來的意思。可以將磁碟的結構理解為多個原片疊起來的柱面,我們用以下的引數取描述乙個磁碟 理論上,我們要操控乙個磁碟,就要對其控制器發出指令,控制磁頭的電機,使磁頭移動到相應的軌道上去 找到乙個柱面 然後開始旋轉...