http://blog.csdn.net/gxfan/article/details/3173292
linux內核地址空間與用戶地址空間的差別
本文僅限在i386平臺下討論一般情況。
1、用戶線性地址空間范圍0-3G,內核線性空間范圍3G-4G。
2、內核總是立即滿足內核空間的物理內存分配,并且分配結果對所有進程可見;而對于用戶空間的內存分配請求,linux總是先保留用戶線性地址空間的一段區域,然后修改頁表項使這段線性區域都指向一頁內容全為0的全局只讀物理頁。當進程寫入這段線性區域時,將會產生一個缺頁異常,這時系統才會為對應的線性地址分配物理頁面,并且把物理頁對應的頁表項置為可寫。為了保持和全局只讀物理頁內容一致,新分配的物理頁內容也會全置為0。
3、用戶線性空間是不可靠的,一般情況下它會隨著進程的切換而改變(在lazy TLB切換下除外);而內核線性空間對所有的進程都一樣,不會隨著進程的切換而改變
?
http://blog.csdn.net/gxfan/article/details/3122489
以下討論僅限 i386 平臺,一般考慮典型情況
-
linux 內核對整個系統的物理內存是通過類型為 struct page 的數組 mem_map 來管理的。系統中的伙伴系統分配算法最終是通過操作這個數組來記錄物理內存的分配、回收等操作。在這里不要被系統的高端內存、低端內存等概念搞混淆了,高、低端內存的分類主要在于區分物理內存地址是否可以直接映射到 內核線性地址空間 中。
我們知道, linux 的內核地址空間大小為 1G (用戶空間 0~3G ,內核空間 3G~4G ,這種分法最常見),因此如果把這 1G 線性地址空間全部拿來 直接一一映射 物理內存的話,在內核態的所有進程(線程)能使用的物理內存總共最多只有 1G, 為了能使在內核態的所有進程能使用更多的物理內存, linux 采取了一種變通的形式:它將 1G 內核線性地址空間分為幾部分,第一部分為 1G 的前 896M ,這部分內核線性空間與物理內存的 0~896M 一一映射(相差一個為 0xc0000000 的常數),后面 128M 的線性空間拿來動態映射剩下的所有物理內存,由于動態映射的方法不一樣,后面的 128M 又分成了幾個部分,有興趣的可以查看相關資料。在這里,前面 896M 線性空間對應的物理內存就是所謂的低端物理內存,剩下的物理內存就是高端物理內存。
從上面高、低端物理內存命名的由來我們可以知道,高、低端物理內存與具體的內存分配算法無關,它們都是被 mem_map 數組控制起來,再由伙伴分配系統實施管理。
?
-
關于進程及其內存分配
首先要明白一個概念:進程中使用的所有地址都是虛地址,在 linux 下這個虛地址就是所謂的線性地址。 linux 中進程可運行在用戶態和內核態,(典型配置情況下)當進程運行在用戶態時,它使用的線性地址只能位于 0~3G 范圍內,當進程運行于內核態時,它使用的線性地址地址范圍為 3G~4G 。
為了把線性地址轉化為物理地址,每個進程都有自己私有的頁目錄和頁表。 linux 在建立進程頁目錄時,把用戶地址空間的頁目錄項( 0~767 項)清空而將內核頁目錄表( swapper_pg_dir )的第 768 項到 1023 項拷貝到進程的頁目錄表的第 768 項到 1023 項中。由于內核在初始化時也只映射了物理內存的前 896M ,我們可以知道內核也目錄表只能保證第 768 項開始的 224 項中有有效映射。 從這里我們可以知道,所有的進程都共享了其內核線性地址空間 。
當一個進程在內核空間發生缺頁故障的時候,這主要發生在訪問內核空間動態映射區線性地址,在其處理程序中,就要通過 0 號進程的頁目錄( swapper_pg_dir )來同步本進程的內核頁目錄,實際上就是拷貝 0 號進程的內核頁目錄到本進程中(內核頁表與進程 0 共享,故不需要復制)。如果進程 0 的該地址處的內核頁目錄也不存在,則出錯,具體代碼可以參考 vmalloc 的實現源碼。
當進程運行于用戶態時,若其需要申請內存空間,內核首先會在其用戶線性空間中分配需要的線性地址空間,再通過伙伴分配系統分配物理內存并把分配的物理內存跟用戶空間線性地址映射起來,最后再修改進程的頁目錄項及頁表項寫入這些映射關系。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
