arm64 上的 crashkernel 内存预留

作者:Baoquan He <bhe@redhat.com>

Kdump 机制用于捕获崩溃内核的 vmcore,以便随后对其进行分析。为此,需要预先保留一块内存,用于预加载 kdump 内核,并在崩溃发生时启动该内核。

为 kdump 保留的内存经过调整,能够以最小的限度容纳 kdump 内核以及收集 vmcore 所需的用户空间程序。

内核参数

通过以下内核参数,可以在第一内核启动的早期阶段相应地预留内存,以便找到一大块连续的内存。如果从高内存区域预留 crashkernel,则需要考虑低内存预留。

低内存和高内存

对于 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,则意味着有意省略了低内存预留。