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,则表示有意省略了低内存预留。