Linux
核心地址空間和核心頁表
我正在學習專業的 Linux 核心架構,我在第 3 章記憶體管理。而我研究核心地址空間本身分為直接映射區、vmalloc區、kmap區和固定映射區。
我想知道的是就像下面一樣。
- 32位機器中核心地址空間的直接映射區域(896MB)是否可以在沒有MMU的情況下被__va、__pa之類的函式訪問?
- 如果 1. 為真,那麼主核心頁表(swapper_pg_dir)只管理 128MB 嗎?
- 在研究核心程式碼時,我發現 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 的映射是不夠的。