段頁結合的實際記憶體管理 虛擬記憶體 OS

2021-10-06 02:48:51 字數 1639 閱讀 6911

如何讓作業系統既支援段又支援頁?

虛擬記憶體:我們讓應用程式分為段,然後對映到一段虛擬記憶體中,再讓虛擬記憶體對映到物理記憶體中的頁中,這樣就完成了段和頁的結合

段、頁同時存在時的重定位(位址翻譯)

乙個實際的段、頁式記憶體管理

記憶體管理核心:記憶體分配

使用記憶體分為五步

1.分配段、建段表

fork()->sys_fork->copy_process

//在linux/kernel/fork.c中

int copy_process(int nr, long ebp, ...)

int copy_mem(int nr, task_struct *p) //nr表示第幾個程序,p為pcb

在上面的程式中,每個程序佔64m的虛擬位址空間,互不重疊,因此,他們可以共用一套頁表,但是實際中頁號是可能重疊的,因此需要有單獨的頁表

2.分配記憶體、建頁表

int copy_mem(int nr, task_struct *p)

int copy_page_tables(unsigned long from, unsigned long to, long size)

}

我們解釋一下int copy_page_tables(...)函式

from_dir = (unsigned long *)((from>>20) & 0xffc);
from是32位虛擬位址,我們將它右移22位就得到頁目錄號了,再乘於4,因為乙個頁目錄大小為4個位元組,因此相當於右移20位

from_dir就是乙個指向頁目錄號的指標,接下來,就是根據這個指標找到每乙個頁號和對應的頁框號

for(; size-->0; from_dir++,to_dir++)

接下來,就是將父程序的頁表拷貝到子程序中

// nr = 1024;

for(; nr-->0; from_page_table++; to_page_table++)

這裡如果你想給子程序單獨設定乙個頁,只要呼叫get_free_page()得到乙個空閒的記憶體位址,再將其賦給子程序的頁表就可以了。

3.重定位

在上面的程式中,如果我們對父程序指向p=0x300, *p=7,那麼父程序就會在通過重定位找到實體地址,然後將7寫入,然後父程序fork()乙個子程序,因為公用的是一套頁表,並且將頁表置位唯讀,因此子程序指向p=0x300, *p=8時,就會重新申請一段記憶體,修改頁表,然後mmu重新計算,然後執行*p = 8,這樣就實現了程序之間的分離。

作業系統 段頁結合的實際記憶體管理

段 頁結合 程式設計師希望用段,物理記憶體希望用頁,所以 從虛擬記憶體中割出乙個區域來給這個段,段就有了對映,但是這個虛擬記憶體不能正真的使用,需要把虛擬記憶體再對映一次,這個時候虛擬記憶體中的段分割成固定大小的頁,每一頁再去對映到物理記憶體中 段面向使用者,頁面向硬體 也就是位址翻譯 從使用者的角...

3 作業系統記憶體管理 段頁式(虛擬記憶體)

注 參考哈工大李治軍老師公開課。本小節需要之前分段與分頁為基礎 對使用者而言,分段是對記憶體的有效使用 而對於計算機而言,分頁可以提高記憶體的使用效率。作業系統需要滿足兩個方面的需求,所以就採取了段頁相結合的方式來管理記憶體。對於使用者而言,當使用者發出乙個邏輯位址,使用者希望訪問到特定程式段的記憶...

虛擬記憶體管理

定義 虛擬記憶體是計算機系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體 乙個連續完整的位址空間 而實際上,它通常是被分隔成多個物理記憶體碎片,還有部分暫時儲存在外部磁碟儲存器上,在需要時進行資料交換。我的理解 程序例項在使用者態並不直接操作物理記憶體位址,實際物理記憶體是可能是...