2.線性位址(也就是虛擬位址)被分成以固定長度為單位的組,成為頁。而分頁單元把所有ram分成固定長度的頁框(又叫物理頁)頁框的長度和頁的長度一致。注意區分頁和頁框,頁只是乙個資料塊,可以存放在實際的任何頁框中,也就是說,頁是內容,頁框是容器。
3.乙個程序的線性位址空間可以分為n多個連續的頁,而這些也可以通過mmu和頁表去轉換為實際的實體地址去訪問對應的頁框(物理頁)。所以乙個程序的線性頁可以對應任何乙個物理頁,只要修改頁表就可以修改,線性頁和物理頁的對應關係。
4.當mmu開啟後,不管是核心還是應用程式在此後的過程中所用的位址都是虛擬位址,都是要通過mmu進行轉換才能訪問到實際的實體地址。所以不管是核心還是應用程式的對任何記憶體的訪問都要對應一張頁表,進行從虛擬位址到實體地址的轉換。
5.對頁表的訪問操作同樣也用的是虛擬位址,眾所周知在fork出乙個新程序a 時肯定至少要為這個新執行緒建立長度為1k*4的一級頁表,而核心對這個一級頁表進行的任何修改操作同樣也是使用虛擬位址程序操作的。同樣,如果上面 fork出的執行緒a如果需要對某個虛擬位址進行讀寫操作時,這時mmu就會發現在一級頁表內找不到這個虛擬位址對應的二級頁表,mmu這時會產生乙個缺頁中斷,通知核心,核心這時會申請1k*4+4k的空間。其中1k用於分配給這個虛擬位址空間所對應的二級頁表,4k用於給程序的**或者資料用。
通過以上分析可以總結出,要申請乙個4m空間至少要4m+2k*4的物理空間。(呵呵,為什麼要加「至少」呢,因為如果要申請的4m的空間落在兩個二級頁表之中的話,那就必須要兩個二級頁表了,最極端的情況是,這4m分別在不同的頁表中,這時就需要1m*4+1k*4的空間來放頁表了。
6.核心在啟動後,會把896m的以下的ram全部對映到核心空間,即以 0xc0000000為基位址的位置。這時核心對虛擬位址0xc0000000~0xc0000000+896m操作即是對0x0~896m的實體地址操作。核心**和靜態核心資料結構就存放在這個0xc0000000~0xc0000000+896m這個範圍之中,這些被核心**和靜態核心資料結構占用的物理記憶體是不能被另作他用的。而其餘的物理記憶體既可以動態的分配給核心用,又可以再被對映到使用者空間中去,給應用程式使用(這就是同乙個物理記憶體被分別對映到使用者空間和核心空間)。
7.動態記憶體的概念:ram中的某些部分要永久固定的分配給核心使用,用來存放核心**和靜態核心資料結構。除了這部分外,ram其餘的部分都稱為動態記憶體,這部分記憶體可以動態的分配給核心和程序使用。
8.cr3是用來為mmu指明當前頁目錄的首位址的暫存器,這樣mmu才能順利的去查頁目錄和頁表,去做虛擬位址轉實體地址的工作。
8.程序在陷入核心時是不需要改變cr3的值的。因為每個程序的 page_dir(頁目錄)從第768項開始都是相同的,即都指向核心態頁表。在fork出生成新的程序時,會以父程序的頁表來初始化子程序的頁表,保證了所有的程序核心頁表都是內容相同的,而使用者態的記憶體頁表根據使用者程序來對使用者頁表(前768項)寫入各自的值。
高階記憶體是指高於3g+
896m的記憶體
嵌入式Linux系統 基礎知識 虛擬記憶體與物理記憶體
在很久以前,還沒有虛擬記憶體概念的時候,程式定址用的都是實體地址。程式能定址的範圍是有限的,這取決於cpu的位址線條數。比如在32位平台下,定址的範圍是2 32也就是4g。並且這是固定的,如果沒有虛擬記憶體,且每次開啟乙個程序都給4g的物理記憶體,就可能會出現很多問題 於是針對上面會出現的各種問題,...
Linux虛擬記憶體
linux採用虛擬段頁式儲存方式來管理記憶體,程式的基本邏輯儲存單元,也可以說是程式段。linux中有四個段,段,資料段,bss段,堆疊段。虛擬位址從低到高依次是 段,資料段,bss段,堆疊段。其中 段為程式本身 二進位制指令 資料段為 中初始化了的全域性變數和靜態變數,bss段為為初始化的全域性變...
Linux虛擬記憶體
一 虛擬記憶體 1 系統會為每個程序分4g的虛擬記憶體空間。32個0 32個1 位址範圍。2 使用者只能使用虛擬位址,無法直接使用物理記憶體。3 虛擬位址與物理記憶體進行對映才能使用,否則就會產生段錯誤。4 虛擬位址與物理記憶體的對映由作業系統動態維護。5 讓使用者使用虛擬位址一方面為了安全,另一方...