kdump分配内存过程分析


1. kimage_alloc_crash_control_pages 为预留的内存分配页

/ kernel / kexec_core.c

1.1 函数功能

这是kexec/kdump机制中分配控制页的核心函数,专用于在预留的 crashkernel 内存区域中分配控制页。
控制页(Control Pages)是内核崩溃时加载第二个内核(crash kernel)所需的临时内存,用于管理内存复制、页表映射等关键操作。


1.2 代码路径

kernel/kexec_core.c(与内核版本相关,可能略有差异)


1.3 参数说明

  • struct kimage *image:描述 kexec 镜像的元数据结构
  • unsigned int order:内存分配阶数(分配大小为2^order * PAGE_SIZE

1.4 核心逻辑分解

1. 内存对齐与空洞搜索
size = (1 << order) << PAGE_SHIFT;
hole_start = (image->control_page + (size - 1)) & ~(size - 1);
hole_end   = hole_start + size - 1;
  • 对齐处理:计算起始地址hole_start,确保按size对齐(例如size=4K时,地址必须是4K的倍数)
  • 空洞定义:从image->control_page开始寻找连续可用内存区域(hole)
2. 循环遍历预留内存区域
while (hole_end <= crashk_res.end) {
   
   
    // ...
    if (hole_end > KEXEC_CRASH_CONTROL_MEMORY_LIMIT) break;
    // ...
}
  • 范围限制:在crashk_res定义的预留内存区域内搜索(由crashkernel=参数预留)
  • 上限检查:通过KEXEC_CRASH_CONTROL_MEMORY_LIMIT限制控制页的最大地址
3. 段重叠检查
for (i = 0; i < image->nr_segments; i++) {
   
   
    mstart = image->segment[i].mem;
    mend   = mstart + image->segment[i].memsz - 1;
    if ((hole_end >= mstart) && (hole_start <= mend)) {
   
   
        // 调整空洞起始位置到当前段末尾
        hole_start = (mend + (size - 1)) & ~(size 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值