簡體   English   中英

Linux內核如何決定要使用哪個內存區域?

[英]How Linux kernel decide to which memory zone to use?

當我檢查pagetypeinfo

貓/ proc / pagetypeinfo

我看到三種類型的存儲區:

  • DMA
  • DMA32
  • 正常

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_DMAZone_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM