Linux 內存管理 -- 線性空間與物理內存


上圖反映瞭如下信息:
1、 進程的4G 線性空間被劃分成三個部分:進程空間(0-3G)、內核直接映射空間(3G – high_memory)、內核動態映射空間(VMALLOC_START - VMALLOC_END)
2、 三個空間使用同一張頁目錄表,通過 CR3 可找到此頁目錄表。但不同的空間在頁目錄表中頁對應不同的項,因此互相不衝突
3、 內核初始化以後,根據實際物理內存的大小,計算出 high_memory、VMALLOC_START、VMALLOC_END 的值。併爲“內核直接映射”空間建立好映射關係,所有的物理內存都可以通過此空間進行訪問。
4、 “進程空間”和“內核動態映射空間”的映射關係是動態建立的(通過缺頁異常)
假設在有三個線性地址 addr1, addr2, addr3 ,分別屬於三個線性空間,但是最終都映射到物理頁面1:
1、 三個地址對應不同的頁表和頁表項
2、 但是頁表項的高 20bit 肯定是1,表示物理頁面的索引號是1
3、 同時,根據高 20 bit,可以從 mem_map[] 中找到對應的 struct page 結構,struct page 用於管理實際的物理頁面(紅線)
4、 從線性地址,根據頁目錄表,頁表,可以找到物理地址
5、 Struct page 和物理地址之間很容易互相轉換
6、 從物理地址,可以很容易的反推出在內核直接映射空間的線性地址(藍線)。要想得到在進程空間或者內核動態映射空間的對應的線性地址,則需要遍歷相應的“虛存區間”鏈表。
關於頁目錄表:
      1、 每個進程有一個屬於自己的頁目錄表,可通過 CR3 寄存器找到
2、 而內核也有一個獨立於其它進程的頁目錄表,保存在 swapper_pg_dir[] 數組中
3、 當進程切換的時候,只需要將新進程的頁目錄把地址加載到 CR3 寄存器中即可
4、 創建一個新進程的時候,需要爲它分配一個 page,作爲頁目錄表,並將 swapper_pg_dir[] 的高 256 項拷貝過來,低 768 項則清0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章