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 的起始地址。

va_kernel_pa_offset

指示核心虛擬對映與物理對映之間的偏移量。用於將虛擬地址轉換為物理地址。