[英]How much memory does a 64bit Linux Kernel take up?
盡管主要使用 48 位地址,但 x86-64 的地址空間很大。
在 x86 32 位機器上,很清楚 kernel 占用了多少 RAM。 通常大約 1 GB 的ZONE_NORMAL
位於 memory 的底部,而物理(非虛擬)地址中 1GB 以上的所有其他內容用於ZONE_HIGHMEM
(用於用戶空間)。 這將是 3:1 的分配。 當然,我們可以有配置,我們可以有 1:3、2:2 等(通過更改VM_SPLIT
)。
RAM 中的 memory 有多少用於 64 位內核的 kernel 空間?
我知道PAGE_OFFSET
設置為遠高於 x64 中物理可尋址 memory 的值(對於 48 和 56)。 x64 中的PAGE_OFFSET
僅描述虛擬地址空間的拆分,而不是物理地址空間(48 位PAGE_OFFSET
為ffff888000000000
)。
那么 memory 的 1 GB 是否包含 kernel 空間? 2GB? 3? 是否有描述大小的變量或宏? 是計算出來的嗎?
每個用戶空間進程都可以使用自己的 2^47 字節 (128 TiB) 的虛擬地址空間。 或者在支持 PML5 的系統上進行更多操作。
用於支持這些頁面的可用物理 RAM 是物理 RAM 的總大小,減去 kernel 自身代碼/數據所需的 30 MiB 左右。 (不包括頁面緩存:Linux 將使用任何備用頁面作為緩沖區和磁盤緩存)。 這主要與虛擬地址空間限制無關。
1G是kernel用了多少虛擬地址空間。 不是多少物理內存。
地址空間問題對於單個進程可以同時使用多少 memory 很重要,但是 kernel 仍然可以使用所有 RAM 來緩存文件數據等。除非您找到2^(48-1)
或2^(57-1)
字節的低半虛擬地址空間范圍狹窄,沒有等效的問題。
請參閱內核的Documentation/x86/x86-64/mm.txt以了解 x86-64 虛擬 memory map。還有為什么 4 級分頁只能覆蓋 64 TiB 的物理地址回復:x86-64 Linux 不做不方便的 HIGHMEM 東西 - 的虛擬地址空間的整個高半部分都為 kernel 保留,它映射所有RAM,因為它是 kernel。
虛擬地址空間的使用確實間接設置了 kernel 可以使用多少物理 RAM 的 64 TiB 限制,但如果小於該值,則沒有任何影響。 就像如果您的機器的 RAM 少於 1 或 2 GiB,32 位 kernel 不是問題一樣。
kernel 實際保留的物理 RAM 量取決於構建選項和模塊,但可能約為 16 到 32 MiB。
檢查dmesg
output 並從 x86-64 5.16.3-arch1 kernel 中查找類似 kernel 的日志消息,我在舊的引導日志消息中找到了它。
Memory: 32538176K/33352340K available (14344K kernel code, 2040K rwdata, 8996K rodata, 1652K init, 4336K bss, 813904K reserved, 0K cma-reserved
不要計算init
(啟動后釋放)或reserved
部分; 我很確定 Linux 實際上並沒有以使其無法用於其他任何用途的方式保留 ~800 MiB。
還要找后面的Freeing unused decrypted memory: 2036K
/ Freeing unused kernel image (initmem) memory: 1652K
等(這和前面列出的init
部分大小相同,這就是為什么你不必計算它的原因。)
它也可能在啟動期間動態分配一些 memory; 最初的“內存”行只是其.text
、 .data
和.bss
部分的總和,static 代碼+數據大小。
在 64 位系統上,唯一的限制是 memory 和 kernel 可以使用多少物理空間。 kernel 將 map 所有可用的內存,用戶空間應用程序應該能夠訪問 kernel 可以提供的盡可能多的內存,同時保持足以讓 kernel 運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.