arm64 上的 crashkernel 記憶體預留¶
作者: Baoquan He <bhe@redhat.com>
Kdump 機制用於捕獲損壞的核心 vmcore,以便隨後進行分析。 為了做到這一點,需要預先保留的記憶體來預載入 kdump 核心,並在發生損壞時啟動該核心。
為 kdump 預留的記憶體經過調整,能夠以最小的程度容納 kdump 核心和 vmcore 收集所需的使用者空間程式。
核心引數¶
透過以下核心引數,可以在第一個核心啟動的早期階段相應地預留記憶體,以便找到一個連續的大塊記憶體。 如果從高記憶體區域預留 crashkernel,則需要考慮低記憶體預留。
crashkernel=size
crashkernel=size,high crashkernel=size,low
低記憶體和高記憶體¶
對於 kdump 預留,低記憶體是指特定限制下的記憶體區域,通常由 kdump 核心執行所需的、支援 DMA 裝置的可用地址位數決定。 可以忽略那些與 vmcore 轉儲無關的裝置。 在 arm64 上,低記憶體上限不是固定的:在 RPi4 平臺上為 1G,但在大多數其他系統上為 4G。 在停用 CONFIG_ZONE_(DMA|DMA32) 構建的特殊核心上,整個系統 RAM 都是低記憶體。 除上述低記憶體之外,系統 RAM 的其餘部分被認為是高記憶體。
實現¶
1) crashkernel=size@offset¶
crashkernel 記憶體必須在使用者指定的區域預留,如果已被佔用則失敗。
2) crashkernel=size¶
crashkernel 記憶體區域將根據搜尋順序在任何可用位置預留
首先,核心在低記憶體區域中搜索具有指定大小的可用區域。
如果搜尋低記憶體失敗,核心將回退到搜尋高記憶體區域中具有指定大小的可用區域。 如果在高記憶體中預留成功,則將在低記憶體中完成預設大小的預留。 目前,預設大小為 128M,足以滿足 kdump 核心的低記憶體需求。
注意: crashkernel=size 是 crashkernel 核心預留的推薦選項。 使用者無需瞭解特定平臺的系統記憶體佈局。
3) crashkernel=size,high crashkernel=size,low¶
crashkernel=size,(high|low) 是 crashkernel=size 的重要補充。 它們允許使用者指定需要分別從高記憶體和低記憶體分配多少記憶體。 在許多系統上,低記憶體非常寶貴,應儘量減少來自該區域的 crashkernel 預留。
要為 crashkernel=size,high 預留記憶體,首先嚐試從高記憶體區域進行搜尋。 如果預留成功,隨後將完成低記憶體預留。
如果從高記憶體的預留失敗,核心將回退到在低記憶體中搜索 crashkernel=,high 中指定的指定大小。 如果成功,則無需進一步預留低記憶體。
註釋
如果未指定 crashkernel=,low,則將自動完成預設的低記憶體預留。
如果指定了 crashkernel=0,low,則表示有意省略了低記憶體預留。