Linux内存管理 - 页表的映射过程初步了解
Linux下的頁表映射分為兩種,一是Linux自身的頁表映射,另一種是ARM32 MMU硬件的映射。
為什么會分兩種;看一下什么是MMU;
MMU是Memory Management Unit的縮寫,中文名是內存管理單元,有時稱作分頁內存管理單元(英語:paged memory management unit,縮寫為PMMU)。
它負責處理中央處理器(CPU)的內存訪問請求的計算機硬件。它的功能包括虛擬地址到物理地址的轉換(即虛擬內存管理)、內存保護、中央處理器高速緩存的控制;
MMU位于處理器內核和連接高速緩存以及物理存儲器的總線之間。當處理器內核取指令或者存取數據的時候,都會提供一個有效地址(effective address),或者稱為邏輯地址、虛擬地址。這個地址是可執行代碼在編譯的時候由鏈接器生成的。有效地址不需要和系統的實際硬件物理地址相匹配,而是通過MMU將有效地址映射成對應的物理地址,以訪問指令和數據。
很早時候的電腦有沒有MMU,記不清;很早期還沒虛擬地址的概念;按資料說,實際上MMU是為滿足操作系統越來越復雜的內存管理而產生的;
1. ARM32頁表映射
?由于ARM32和Linux內核維護的頁表項有所不同,所以維護了兩套PTE。
PGD存放在swapper_pd_dir中,一個PGD目錄項其實包含了兩份ARM32 PGD。
所以再分配PTE的時候,共分配了1024個PTE,512個給Linux OS維護用;512個給ARM32 MMU用,對應兩個PGD的頁表數目。
1.1 ARM32處理器查詢頁表
32bit的Linux采用三級映射:PGD-->PMD-->PTE,64bit的Linux采用四級映射:PGD-->PUD-->PMD-->PTE,多了個PUD。
縮寫是PGD:Page Global Directory、PUD:Page Upper Directory、PMD:Page Middle Directory、PTE:Page Table Entry。
1.2 Linux頁表映射相關數據結構
我們知道在map_lowmem()使用create_mapping()創建頁表映射,這個函數的參數結構是struct map_desc。
下面來研究它的相關結構,有助于理解內核是如何處理頁表映射的。
arch\arm\include\asm\mach\map.h:
struct map_desc {
??? unsigned long virtual;------虛擬地址起始地址
??? unsigned long pfn;----------物理地址開始頁幀號
??? unsigned long length;-------內存空間大小
??? unsigned int type;----------mem_types中的序號
};
......
總結
以上是生活随笔為你收集整理的Linux内存管理 - 页表的映射过程初步了解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Razor (标记)语言
- 下一篇: SVN 图标和工具、wc.db学习