[英]How Linux kernel decide to which memory zone to use?
當我檢查pagetypeinfo
貓/ proc / pagetypeinfo
我看到三種類型的存儲區:
Linux如何選擇一個內存區域來分配新頁面?
這些存儲區僅針對32位系統而不是64位定義。
記住這些是我們正在談論的內核可訪問的main memory
。 在32 bit
(4GB)系統中,內核和用戶空間之間的比例為1:3
。 意味着內核可以訪問1GB,用戶空間可以為3GB。 內核的1GB划分如下:
Zone_DMA(0-16MB): 永久映射到內核地址空間。
由於兼容性原因,較舊的ISA設備只能訪問較低的16MB主內存。
Zone_Normal(16MB-896MB): 永久映射到內核地址空間。
許多內核操作只能使用ZONE_NORMAL
因此它是性能最關鍵的區域,並且是大部分由內核分配的內存。
ZONE_HIGH_MEM(896MB以上): 沒有永久映射到內核的地址空間。
內核可以訪問整個4GB主內存。 分別通過Zone_DMA
和Zone_Normal
1GB的內核,通過Zone_DMA
Zone_Normal
用戶3GB的ZONE_HIGH_MEM
。 借助Intel的Physical Address Extension (PAE)
,人們可以獲得4個額外的位來尋址主內存,從而獲得36位,即總共64GB的可訪問內存。 增量地址空間(36位地址-32位地址)是ZONE_HIGH_MEM
用於映射到用戶訪問的主存儲器(即2GB-4GB之間)的地方。
閱讀更多:
http://www.quora.com/Linux-Kernel/Why-is-there-ZONE_HIGHMEM-in-the-x86-32-Linux-kernel-but-not-in-the-x86-64-kernel
http://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory
Linux 3/1虛擬地址拆分
對於每個內存分配請求(例如,通過kmalloc的請求),內核都會根據傳遞給函數的標志來選擇內存區域。 這些請求在內部觸發內核函數alloc_pages()。
zonelist是傳遞給alloc_pages()的參數,該參數指向zonelist數據結構,該數據結構按優先順序描述適合於內存分配的內存區域。
請參閱《了解Linux內核》一書中的內存管理一章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.