Linux

核心地址空間和核心頁表

  • December 16, 2018

我正在學習專業的 Linux 核心架構,我在第 3 章記憶體管理。而我研究核心地址空間本身分為直接映射區、vmalloc區、kmap區和固定映射區。

在此處輸入圖像描述

我想知道的是就像下面一樣。

  1. 32位機器中核心地址空間的直接映射區域(896MB)是否可以在沒有MMU的情況下被__va、__pa之類的函式訪問?
  2. 如果 1. 為真,那麼主核心頁表(swapper_pg_dir)只管理 128MB 嗎?
  3. 在研究核心程式碼時,我發現 32 位和 64 位之間的 paging_init 函式存在差異。在 32 位中,我在 paging_init 函式中找到了初始化和主控核心頁表的pagetable_init函式。

32 位的函式 paging_init

void __init pageit_init(void){
   pagetable_init();
   __flush_tlb_all();

   kmap_init();

   olpc_dt_build_devicetree();
   sparse_memory_present_with_active_regions(MAX_NUMNODES);
   sparse_init();
   zone_sizes_init(); 
}

但是在 64 位中,我在paging_init函式中找不到核心頁表相關函式。

void __init paging_init(void)
{
   sparse_memory_present_with_active_regions(MAX_NUMNODES);
   sparse_init();

   node_clear_state(0, N_MEMORY);
   if (N_MEMORY != N_NORMAL_MEMORY)
       node_clear_state(0, N_NORMAL_MEMORY);

   zone_sizes_init();
}

64位核心沒有主核心頁表嗎?如果是真的,它只是通過直接映射來訪問核心記憶體嗎?

問題 1 和 2 的答案:不,一旦啟用分頁,CPU 指令僅使用虛擬地址,在讀取或寫入 RAM 之前使用 MMU 將其轉換為物理地址。和宏不訪問記憶體,它們只是在地址空間之間轉換地址__va__pa在 32 位機器上,__va只需添加0xc0000000作為參數給出的物理地址,因為已設置映射,因此物理地址N位於虛擬地址N+0xc0000000

你想用 CPU 訪問的地址必須有一個映射;你不能繞過MMU。因此,僅管理 128 MB 的映射是不夠的。

引用自:https://unix.stackexchange.com/questions/412100