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=大小@偏移量

crashkernel 内存必须在用户指定的区域预留,如果已被占用则失败。

2) crashkernel=大小

crashkernel 内存区域将根据搜索顺序在任何可用位置预留

首先,内核在低内存区域搜索指定大小的可用区域。

如果搜索低内存失败,内核会回退到在高内存区域搜索指定大小的可用区域。如果在高内存中预留成功,则会在低内存中完成默认大小的预留。目前,默认大小为 128M,足以满足 kdump 内核的低内存需求。

注意:crashkernel=大小 是 crashkernel 内核预留的推荐选项。用户无需了解特定平台的系统内存布局。

3) crashkernel=大小,high crashkernel=大小,low

crashkernel=大小,(high|low) 是 crashkernel=大小 的重要补充。它们允许用户分别指定需要从高内存和低内存分配多少内存。在许多系统上,低内存非常宝贵,因此应尽可能减少从此区域预留 crashkernel。

要为 crashkernel=大小,high 预留内存,首先尝试从高内存区域进行搜索。如果预留成功,则随后会完成低内存预留。

如果从高内存预留失败,内核会回退到使用 crashkernel=,high 中指定的大小搜索低内存。如果成功,则无需进一步预留低内存。

注意事项

  • 如果未指定 crashkernel=,low,则会自动完成默认的低内存预留。

  • 如果指定了 crashkernel=0,low,则意味着有意省略了低内存预留。