ARM平台linux核心Notes 2
linux記憶體管理的任務
1)組織規劃整個系統的物理和虛擬儲存空間分布;
2)為虛擬儲存空間(線性地址空間)建立頁表,即建立虛擬位址到物理地址的映射關係;
3)設定不同存數空間的存取控制屬性,保護系統儲存空間不被非法訪問;
4)記憶體配置和釋放。
1 linux中的物理和虛擬儲存空間的分布
支援MMU的32位微處理器上,linux實體儲存體空間和虛擬儲存空間定址範圍都是0x0000_0000~0xFFFF_FFFF,為4GB。
但是linux運行在虛擬儲存空間中,而實際使用中將 遠小於4GB的實體記憶體映射為虛擬記憶體的4GB。
實體儲存體空間分布(引用《嵌入式系統linux核心開發實戰指南(ARM平台)》)
其中:
1)noden,n <= MAX_NUMNODES-1,MAX_NUMNODES在ARM系統中,sharp晶片支援16個nodes,其他支援4個。
2)numnodes為當前node個數。
3)設定CONFIG_DISCONTIGMEM的系統中,可以有多個node,否則只含node0。
4)bankn,n <= NR_BANKS-1,NR_BANKS在ARM系統中,sharp晶片支援16個nodes,其他支援4個。
5)mem_init()可以將所有節點的頁幀位碼所佔空間、孔洞頁描述符空間及空閑記憶體釋放。
虛擬儲存空間分布(引用《嵌入式系統linux核心開發實戰指南(ARM平台)》)
1)線性地址空間0x0000_0000~0xFFFF_FFFF,4GB
使用者空間0x0000_0000~0xBFFF_FFFF(3GB),核心空間0xC000_0000~0xFFFF_FFFF(1GB)
2)低端記憶體:核心邏輯地址空間所映射的實體記憶體就是低端記憶體。
低端記憶體實體記憶體的物理地址與線性地址之間的轉換可以通過__pa(x)和__va(x)來進行。
#define __pa(x) __virt_to_phys((unsigned long)(x))//宏__pa(x)#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)#define __va(x) ((void *)__phys_to_virt((unsigned long)(x)))//宏__va(x)#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
3)高端記憶體
0xFFFF_FFFF -- -- --|-- //這部分即為高端實體記憶體,從high_memory~0xFFFF_FFFF --|-- //若實際實體記憶體>896MB,則high_memory = 896MB --|-- //若實際實體記憶體<896MB,則直接分配high_memory = 實際實體記憶體 --|-- //意為 0C000_0000~high_memory對應的就是實際的實體記憶體地址 high_memory --|-- 0xC000_0000 -- --
在ARM處理器中,從虛擬位址到物理地址可以只經過一級地址轉換,也可以經過兩級地址轉換。
原文地址 http://www.cnblogs.com/plinx/archive/2013/01/16/2862462.html