我可以存取兩個 Linux 發行版,都是客製化的 Debian。
使用相同的測試程序,在其中一個上產生的核心檔案約為 35 MiB。另一方面,它約為 290 MiB。該程式產生一些線程,進行一些分配,然後永遠忙循環。
使用 檢查核心readelf
,我發現較大的核心包括以下部分:
LOAD 0x000000000815e6b8 0x00007f8594021000 0x0000000000000000
0x0000000003fdf000 0x0000000003fdf000 R 0x1
查看記憶體映射,對應於:
7f8594021000-7f8598000000 ---p 00000000 00:00 0
Size: 65404 kB
Rss: 0 kB
Pss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 0 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
VmFlags: mr mw me nr
我理解這個區域是專用於線程區域的未使用記憶體。該區域在運行時存在於兩個發行版中,但僅寫入其中一個發行版的核心檔案中。為什麼會這樣呢?
兩者coredump_filter
都是相同的(0x33),所以不是那樣的。
編輯:gcore
我進一步追蹤在進程上運行改變核心中虛擬記憶體區域的方式的差異。在具有較小內核的內核上,它不會將它們標記為“已寫入”,但在較大內核上,它會標記為“已寫入”。具體來說,它創建了一個anon_vma
結構。