簡體   English   中英

一個64bit的Linux Kernel占多少memory?

[英]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_OFFSETffff888000000000 )。

那么 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.

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