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

最低0.47元/天 解锁文章
1893

被折叠的 条评论
为什么被折叠?



