Linux内核分页与ELF64格式解析
1. 分页机制概述
在Linux内核启动过程中,内存管理是极为复杂的一部分。在进入内核初始化的后续步骤之前,我们需要了解分页机制,它是将线性内存地址转换为物理地址的重要机制。
在之前,我们了解过实模式和保护模式下的分段机制。实模式下,物理地址通过将段寄存器左移4位再加上偏移量来计算;保护模式下,则使用描述符表和描述符中的基地址加上偏移量来计算物理地址。现在,我们将聚焦于64位模式下的分页机制。
根据英特尔手册,分页为实现传统的按需分页虚拟内存系统提供了一种机制,程序执行环境的各个部分可以根据需要映射到物理内存中。
2. 分页模式与启用
存在三种分页模式:
- 32位分页
- PAE分页
- IA - 32e分页
这里主要介绍IA - 32e分页模式。启用该模式需要进行以下操作:
1. 设置CR0.PG位
2. 设置CR4.PAE位
3. 设置IA32_EFER.LME位
在arch/x86/boot/compressed/head_64.S中可以看到这些位的设置代码:
movl $(X86_CR0_PG | X86_CR0_PE), %eax movl %eax, %cr0 movl $MSR_EFER, %ecx rdmsr btsl $_EFER_LME, %e