VMCOREINFO¶
它是什麼?¶
VMCOREINFO 是一個特殊的 ELF 註記(note)段。它包含核心中的各種資訊,例如結構體大小、頁大小、符號值、欄位偏移等。這些資料被打包到一個 ELF 註記段中,並由 crash 和 makedumpfile 等使用者空間工具用於分析核心的記憶體佈局。
常用變數¶
init_uts_ns.name.release¶
Linux 核心版本。用於查詢構建核心所用的相應原始碼。例如,crash 使用它來查詢相應的 vmlinux 以處理 vmcore。
PAGE_SIZE¶
頁的大小。它是記憶體管理設施使用的最小資料單位。通常大小為 4096 位元組,頁按 4096 位元組對齊。用於計算頁地址。
init_uts_ns¶
UTS 名稱空間,用於隔離與 uname(2) 系統呼叫相關的兩個特定系統元素。它以用於儲存 uname(2) 系統呼叫返回的資訊的資料結構命名。
使用者空間工具可以從中獲取核心名稱、主機名、核心發行版本號、核心版本、架構名稱和作業系統型別。
(uts_namespace, name)¶
name 成員的偏移量。Crash Utility 和 Makedumpfile 從中獲取 init_uts_ns.name 的起始地址。
node_online_map¶
一個 node_states[N_ONLINE] 陣列,表示系統中線上節點的集合,每個節點號對應一個位位置。用於跟蹤哪些節點在系統中並且線上。
swapper_pg_dir¶
核心的全域性頁目錄指標。用於將虛擬地址轉換為物理地址。
_stext¶
定義文字段的起始。通常,_stext 指示核心起始地址。用於將直接核心對映中的虛擬地址轉換為物理地址。
VMALLOC_START¶
儲存 vmalloc 區域的基地址。makedumpfile 獲取此值,因為 vmalloc 轉換需要它。
mem_map¶
物理地址透過將其視為 mem_map 陣列的索引來轉換為 struct pages。將物理地址右移 PAGE_SHIFT 位,可將其轉換為頁幀號,該頁幀號是 mem_map 陣列的索引。
用於將地址對映到相應的 struct page。
contig_page_data¶
Makedumpfile 從此符號獲取 pglist_data 結構體,該結構體用於描述記憶體佈局。
使用者空間工具使用它在轉儲記憶體時排除空閒頁。
mem_section|(mem_section, NR_SECTION_ROOTS)|(mem_section, section_mem_map)¶
mem_section 陣列的地址、其長度、結構體大小以及 section_mem_map 偏移量。
它存在於稀疏記憶體對映模型中,並且與 mem_map 變數有些相似,它們都用於轉換地址。
MAX_PHYSMEM_BITS¶
定義最大支援的物理地址空間記憶體。
page¶
頁結構體的大小。struct page 是一個重要的資料結構,廣泛用於計算連續記憶體。
pglist_data¶
pglist_data 結構體的大小。此值用於檢查 pglist_data 結構體是否有效。它也用於檢查記憶體型別。
zone¶
區域結構體的大小。此值用於檢查是否找到了區域結構體。它也用於排除空閒頁。
free_area¶
free_area 結構體的大小。它指示 free_area 結構體是否有效。在排除空閒頁時很有用。
list_head¶
list_head 結構體的大小。在事後分析會話中遍歷列表時使用。
nodemask_t¶
nodemask_t 型別的大小。用於計算線上節點的數量。
(page, flags|_refcount|mapping|lru|_mapcount|private|compound_order|compound_head)¶
使用者空間工具根據這些變數的偏移量計算其值。這些變數用於排除不必要的頁。
(pglist_data, node_zones|nr_zones|node_mem_map|node_start_pfn|node_spanned_pages|node_id)¶
在 NUMA 機器上,每個 NUMA 節點都有一個 pg_data_t 來描述其記憶體佈局。在 UMA 機器上,只有一個 pglist_data 來描述整個記憶體。
這些值用於檢查記憶體型別和計算記憶體對映的虛擬地址。
(zone, free_area|vm_stat|spanned_pages)¶
每個節點被劃分為多個稱為區域(zone)的塊,這些塊表示記憶體中的範圍。一個區域由一個結構體 zone 描述。
使用者空間工具根據這些變數的偏移量計算所需值。
(free_area, free_list)¶
free_list 成員的偏移量。此值用於計算空閒頁的數量。
每個區域都有一個名為 free_area[NR_PAGE_ORDERS] 的 free_area 結構體陣列。free_list 表示空閒頁塊的連結串列。
(list_head, next|prev)¶
list_head 成員的偏移量。list_head 用於定義一個迴圈連結串列。使用者空間工具需要這些以便遍歷列表。
(vmap_area, va_start|list)¶
vmap_area 成員的偏移量。它們攜帶 vmalloc 特定的資訊。Makedumpfile 從中獲取 vmalloc 區域的起始地址。
(zone.free_area, NR_PAGE_ORDERS)¶
空閒區域描述符。使用者空間工具使用此值來遍歷 free_area 範圍。NR_PAGE_ORDERS 由區域夥伴分配器使用。
prb¶
指向 printk 環形緩衝區 (struct printk_ringbuffer) 的指標。根據核心轉儲發生的時間,這可能指向靜態引導環形緩衝區或動態分配的環形緩衝區。使用者空間工具使用它來讀取活動的核心日誌緩衝區。
printk_rb_static¶
指向靜態引導 printk 環形緩衝區的指標。如果 @prb 有不同的值,這對於檢視初始引導訊息很有用,這些訊息可能已在動態分配的環形緩衝區中被覆蓋。
clear_seq¶
最後一次清除命令後 printk() 記錄的序列號。它指示最後一次 SYSLOG_ACTION_CLEAR(例如由 'dmesg -c' 發出)後的第一條記錄。使用者空間工具使用它來轉儲 dmesg 日誌的子集。
printk_ringbuffer¶
printk_ringbuffer 結構體的大小。此結構體包含訪問核心日誌緩衝區的各個元件所需的所有資訊。
(printk_ringbuffer, desc_ring|text_data_ring|dict_data_ring|fail)¶
printk 環形緩衝區的各個元件的偏移量。使用者空間工具使用它來檢視核心日誌緩衝區,而無需宣告結構體。
prb_desc_ring¶
prb_desc_ring 結構體的大小。此結構體包含有關記錄描述符集的資訊。
(prb_desc_ring, count_bits|descs|head_id|tail_id)¶
描述記錄描述符集欄位的偏移量。使用者空間工具使用它來遍歷描述符,而無需宣告結構體。
prb_desc¶
prb_desc 結構體的大小。此結構體包含有關單個記錄描述符的資訊。
(prb_desc, info|state_var|text_blk_lpos|dict_blk_lpos)¶
描述記錄描述符欄位的偏移量。使用者空間工具使用它來讀取描述符,而無需宣告結構體。
prb_data_blk_lpos¶
prb_data_blk_lpos 結構體的大小。此結構體包含有關文字或字典資料(資料塊)在相應資料環中位置的資訊。
(prb_data_blk_lpos, begin|next)¶
描述資料塊位置欄位的偏移量。使用者空間工具使用它來定位資料塊,而無需宣告結構體。
printk_info¶
printk_info 結構體的大小。此結構體包含記錄的所有元資料。
(printk_info, seq|ts_nsec|text_len|dict_len|caller_id)¶
提供記錄元資料欄位的偏移量。使用者空間工具使用它來讀取資訊,而無需宣告結構體。
prb_data_ring¶
prb_data_ring 結構體的大小。此結構體包含有關一組資料塊的資訊。
(prb_data_ring, size_bits|data|head_lpos|tail_lpos)¶
描述一組資料塊欄位的偏移量。使用者空間工具使用它來訪問資料塊,而無需宣告結構體。
atomic_long_t¶
atomic_long_t 結構體的大小。使用者空間工具使用它來複制整個結構體,無論其架構特定的實現如何。
(atomic_long_t, counter)¶
atomic_long_t 變數的 long 值偏移量。使用者空間工具使用它來訪問 long 值,而無需架構特定的宣告。
(free_area.free_list, MIGRATE_TYPES)¶
頁的遷移型別數量。free_list 由陣列描述。工具使用它來計算空閒頁的數量。
NR_FREE_PAGES¶
在 linux-2.6.21 或更高版本中,空閒頁的數量在 vm_stat[NR_FREE_PAGES] 中。用於獲取空閒頁的數量。
PG_lru|PG_private|PG_swapcache|PG_swapbacked|PG_slab|PG_hwpoision|PG_head_mask|PG_hugetlb¶
頁屬性。這些標誌用於過濾各種不需要轉儲的頁。
PAGE_BUDDY_MAPCOUNT_VALUE(~PG_buddy)|PAGE_OFFLINE_MAPCOUNT_VALUE(~PG_offline)|PAGE_OFFLINE_MAPCOUNT_VALUE(~PG_unaccepted)¶
更多頁屬性。這些標誌用於過濾各種不需要轉儲的頁。
x86_64¶
phys_base¶
用於將匯出的核心符號的虛擬地址轉換為其對應的物理地址。
init_top_pgt¶
用於遍歷整個頁表並將虛擬地址轉換為物理地址。init_top_pgt 與 swapper_pg_dir 有些相似,但它僅用於 x86_64。
pgtable_l5_enabled¶
使用者空間工具需要知道崩潰核心是否處於 5 級分頁模式。
node_data¶
這是一個 struct pglist_data 陣列,儲存所有 NUMA 節點資訊。Makedumpfile 從中獲取 pglist_data 結構體。
(node_data, MAX_NUMNODES)¶
系統中的最大節點數量。
KERNELOFFSET¶
核心隨機化偏移量。用於計算頁偏移量。如果 KASLR 被停用,此值為零。
KERNEL_IMAGE_SIZE¶
Makedumpfile 目前未使用。用於 Crash 計算模組虛擬地址。
sme_mask¶
AMD 特有的 SME 支援:它指示安全記憶體加密掩碼。Makedumpfile 工具需要知道崩潰核心是否已加密。如果在第一個核心中啟用了 SME,則崩潰核心的頁表條目(pgd/pud/pmd/pte)包含記憶體加密掩碼。這用於移除 SME 掩碼並獲取真實的物理地址。
目前,sme_mask 儲存 C 位位置的值。如果需要,可以將其他 SME 相關資訊放在該變數中。
例如
[ misc ][ enc bit ][ other misc SME info ]
0000_0000_0000_0000_1000_0000_0000_0000_0000_0000_..._0000
63 59 55 51 47 43 39 35 31 27 ... 3
x86_32¶
X86_PAE¶
表示物理地址擴充套件是否啟用。它的代價是更高的頁表查詢開銷,並且每個程序消耗更多的頁表空間。用於在將虛擬地址轉換為物理地址時檢查崩潰核心中是否啟用了 PAE。
ARM64¶
VA_BITS¶
虛擬地址的最大位數。用於計算虛擬記憶體範圍。
kimage_voffset¶
核心虛擬對映與物理對映之間的偏移量。用於將虛擬地址轉換為物理地址。
PHYS_OFFSET¶
指示記憶體起始的物理地址。類似於 kimage_voffset,用於將虛擬地址轉換為物理地址。
KERNELOFFSET¶
核心隨機化偏移量。用於計算頁偏移量。如果 KASLR 被停用,此值為零。
KERNELPACMASK¶
用於從核心虛擬地址中提取指標認證碼的掩碼。
TCR_EL1.T1SZ¶
指示 TTBR1_EL1 地址的記憶體區域的大小偏移量。區域大小為 2^(64-T1SZ) 位元組。
TTBR1_EL1 是 ARMv8-A 架構指定的表基址暫存器,用於在較高 VA 範圍(有關詳細資訊,請參閱 ARMv8 ARM 文件)中查詢虛擬地址的頁表。
MODULES_VADDR|MODULES_END|VMALLOC_START|VMALLOC_END|VMEMMAP_START|VMEMMAP_END¶
- 用於獲取正確的範圍
MODULES_VADDR ~ MODULES_END-1:核心模組空間。 VMALLOC_START ~ VMALLOC_END-1:vmalloc() /
ioremap()空間。 VMEMMAP_START ~ VMEMMAP_END-1:vmemmap 區域,用於 struct page 陣列。
arm¶
ARM_LPAE¶
它指示崩潰核心是否支援大物理地址擴充套件。用於將虛擬地址轉換為物理地址。
s390¶
lowcore_ptr¶
一個數組,包含指向每個 CPU lowcore 的指標。用於列印 psw 和所有暫存器資訊。
high_memory¶
用於從 high_memory 符號獲取 vmalloc_start 地址。
(lowcore_ptr, NR_CPUS)¶
最大 CPU 數量。
powerpc¶
node_data|(node_data, MAX_NUMNODES)¶
參見上文。
contig_page_data¶
參見上文。
vmemmap_list¶
vmemmap_list 維護整個 vmemmap 物理對映。用於獲取 vmemmap 列表計數和已填充的 vmemmap 區域資訊。如果 vmemmap 地址轉換資訊儲存在崩潰核心中,它將用於轉換 vmemmap 核心虛擬地址。
mmu_vmemmap_psize¶
頁的大小。用於將虛擬地址轉換為物理地址。
mmu_psize_defs¶
頁大小定義,即 4k、64k 或 16M。
用於進行虛擬地址到物理地址的轉換 (vtop translations)。
vmemmap_backing|(vmemmap_backing, list)|(vmemmap_backing, phys)|(vmemmap_backing, virt_addr)¶
vmemmap 虛擬地址空間管理沒有傳統的頁表來跟蹤哪些虛擬 struct page 由物理對映支援。虛擬到物理的對映以簡單的連結串列格式進行跟蹤。
使用者空間工具在計算 vmemmap 區域數量時需要知道 list、phys 和 virt_addr 的偏移量。
mmu_psize_def|(mmu_psize_def, shift)¶
struct mmu_psize_def 的大小和 mmu_psize_def 成員的偏移量。
用於虛擬地址到物理地址的轉換 (vtop translations)。
sh¶
node_data|(node_data, MAX_NUMNODES)¶
參見上文。
X2TLB¶
指示崩潰核心是否啟用了 SH 擴充套件模式。
RISCV64¶
VA_BITS¶
虛擬地址的最大位數。用於計算虛擬記憶體範圍。
PAGE_OFFSET¶
指示直接對映 RAM 區域的虛擬核心起始地址。
phys_ram_base¶
指示物理 RAM 的起始地址。
MODULES_VADDR|MODULES_END|VMALLOC_START|VMALLOC_END|VMEMMAP_START|VMEMMAP_END|KERNEL_LINK_ADDR¶
用於獲取正確的範圍
MODULES_VADDR ~ MODULES_END:核心模組空間。
VMALLOC_START ~ VMALLOC_END:vmalloc() /
ioremap()空間。VMEMMAP_START ~ VMEMMAP_END:vmemmap 空間,用於 struct page 陣列。
KERNEL_LINK_ADDR:核心連結和 BPF 的起始地址。
va_kernel_pa_offset¶
指示核心虛擬對映與物理對映之間的偏移量。用於將虛擬地址轉換為物理地址。