程序使用的是虛擬記憶體中的位址,也叫線性位址,由作業系統協助相關硬體(如mmu),對映到實體地址。線性位址是通過頁表(page table)對映到物理記憶體,頁表由作業系統維護並被處理器引用。核心空間在頁表中擁有較高特權級,因此使用者態程式試圖訪問這些頁時會導致乙個頁錯誤。在linux中,核心空間是持續存在的,並且在所有程序中都對映到同樣的物理記憶體。核心**和資料總是可定址,隨時準備處理中斷和系統呼叫。與此相反,使用者模式位址空間的對映隨程序切換的發生而不斷變化。在32位機器上linux作業系統中的程序的位址空間大小是4g,其中0-3g是使用者空間,3g-4g是核心空間。其實,這個4g的位址空間是不存在的,也就是我們所說的虛擬記憶體空間。
程序位址空間由允許程序使用的全部線性位址組成,與程序位址空間有關的全部資訊都包含在乙個叫做記憶體描述符的資料結構中,這個結構的型別為mm_struct。linux通過型別為vm_area_struct的物件實現線性區,每個線性區描述符表示乙個線性位址空間,程序所擁有的線性區從不重疊,並且核心盡力把新分配的線性區與緊鄰的現有線性區進行合併。如果兩個相鄰區的訪問許可權匹配,就能把他們合併在一起。下圖描述了程序位址空間、記憶體描述符、線性區鍊錶之間的關係:
核心頻繁執行的乙個操作就是查詢包含指定線性位址空間的線性區,為了提高效率linux2.6把記憶體描述符存放在叫做紅黑樹(read-black-tree)的資料結構中。為了存放程序的線性區,linux既使用了鍊錶,又使用了紅黑樹,一般的,紅黑樹用來確定含有指定位址的線性區,而鍊錶通常在掃瞄整個線性區集合時使用。線性區的大小是4kb的倍數(必須包含完整的頁),而棧的大小卻是任意的。c語言中的每個段空間就是通過vm_area_struct表示,他們關係如下 :
當乙個程式被執行時,該程式的內容必須被放到程序的虛擬位址空間(注意,是虛擬位址空間),對於可執行程式的共享庫也是如此。可執行程式並非真正讀到物理記憶體中,而只是鏈結到程序的虛擬記憶體中(此時都是在程序的虛擬位址空間)。當乙個可執行程式對映到程序虛擬位址空間時,一組vm_area_struct資料結構將被產生。每個vm_area_struct資料結構表示可執行印象的一部分;是可執行**,或是初始化的資料,以及未初始化的資料等。
3.請求調頁和缺頁異常:
請求調頁是 一種動態記憶體分配技術,它把頁框的分配推遲到不能再推遲為止。這種技術的動機是:程序開始執行的時候並不訪問位址空間中的全部內容。事實上,有一部分位址 也許永遠也不會被程序所使用。程式的區域性性原理也保證了在程式執行的每個階段,真正使用的程序頁只有一小部分,對於臨時用不到的頁,其所在的頁框可以由其 它程序使用。因此,請求分頁技術增加了系統中的空閒頁框的平均數,使記憶體得到了很好的利用。從另外乙個角度來看,在不改變記憶體大小的情況下,請求分頁能夠 提高系統的吞吐量。當程序要訪問的頁不在記憶體中的時候,就通過缺頁異常處理將所需頁調入記憶體中。
cpu通過位址匯流排可以訪問連線在位址匯流排上的所有外設,包括物理記憶體、io裝置等等,但從cpu發出的訪問位址並非是這些外設在位址匯流排上的實體地址,而是乙個虛擬位址,由mmu將虛擬位址轉換成實體地址再從位址匯流排上發出,mmu上的這種虛擬位址和實體地址的轉換關係是需要建立的,並且mmu還可以設定這個物理頁是否可以進行寫操作,當沒有建立乙個虛擬位址到實體地址的對映,或者建立了這樣的對映,但那個物理頁不可寫的時候,mmu將會通知cpu產生了乙個缺頁異常。
下面總結下缺頁異常的幾種情況:
目前來看,應該就是這四種情況,還是比較清晰的,可發現乙個重要規律就是,linux是直到實在不行的時候才會分配物理頁。從使用者空間的缺頁異常分為兩種情況:
缺頁處理函式為arch/arm/mm/fault.c檔案中的do_page_fault函式。
Linux核心之程序位址空間
核心是作業系統中優先順序最高的成分 核心信任自己 核心總是盡量推遲給使用者態程序分配動態記憶體 核心必須能隨時準備捕獲使用者態程序引起的所有定址錯誤 當使用者態程序請求動態記憶體時,並沒有會的請求頁框,而僅僅獲得對乙個新的線性位址區間的使用權,而這一線性位址區間就稱為程序位址空間的一部分,這一區間叫...
深入理解Linux核心 程序位址空間
給核心分配記憶體和給使用者態程序分配記憶體是有區別的 1 核心的優先順序最高,如果某個核心函式請求動態記憶體,不會被延時 2 核心信任自己,不必保護措施 3 使用者態程序對動態記憶體的請求被認為不是緊迫的,總是被盡量推遲分配 4 使用者程序總是不可信任的 程序的位址空間 1 由允許程序使用的全部線性...
linux 程序位址空間
乙個linux程序的虛擬位址空間分布如下圖所示,分為使用者空間和核心空間,對於乙個32位作業系統來說,4gb的空間分成兩部分,低位址的0 3g給使用者空間,高位址的3g 4g給核心空間 2.1 唯讀資料段 rodata,又叫做常量資料段 存放唯讀資料 字串常量和const修飾的全域性變數 const...