展示代码
SYM_FUNC_START_LOCAL(__primary_switch)
#ifdef CONFIG_RANDOMIZE_BASE
mov x19, x0 // preserve new SCTLR_EL1 value
mrs x20, sctlr_el1 // preserve old SCTLR_EL1 value
#endif
adrp x1, init_pg_dir
bl __enable_mmu
函数 primary_entry 执行完毕 __cpu_setup 之后紧接着调用 __primary_switch,下面我们一起分析该函数
第2行涉及到条件编译 CONFIG_RANDOMIZE_BASE,笔者使用的内核
$ cat .config | grep CONFIG_RANDOMIZE_BASE
CONFIG_RANDOMIZE_BASE=y
其含义如下
Prompt: Randomize the address of the kernel image
在Linux内核中,CONFIG_RANDOMIZE_BASE是一个配置选项,用于启用内核地址空间布局随机化(KASLR,Kernel Address Space Layout Randomization)。
当启用这个选项时,内核的基地址(包括代码、数据、BSS段等)在每次启动时都会随机化,使得内核的物理和虚拟地址在启动时被随机偏移。这样做可以增加攻击者预测内核结构布局的难度,从而提高系统的安全性。
具体来说,CONFIG_RANDOMIZE_BASE会影响以下几个方面:
内核文本和模块基址:内核的物理和虚拟基地址在启动时随机化,使得内核代码的位置不固定。
内核栈基址:如果内核栈的基地址在不同进程或系统调用之间不同,那么攻击者定位栈上特定目标的难度会增加。
动态内存基址:内核的动态内存分配(例如kmalloc、vmalloc等)的基地址也会随机化,使得内存布局不固定。
此外,CONFIG_RANDOMIZE_BASE是CONFIG_DYNAMIC_MEMORY_LAYOUT和CONFIG_RANDOMIZE_MEMORY的先决条件。CONFIG_RANDOMIZE_MEMORY会随机化内核内存段的基本虚拟地址,如物理内存映射、vmalloc和vmemmap。
禁用CONFIG_RANDOMIZE_BASE可以通过在内核启动参数中添加nokaslr来实现,这会导致内核的加载地址在每次启动时都是相同的,从而降低了安全性。
总的来说,CONFIG_RANDOMIZE_BASE是一个重要的安全特性,可以防止多种类型的攻击,特别是那些依赖于内核地址预测的攻击。
我们先不分析这个属性,我们关注启用 MMU。
第7行将 init_pg_dir 的物理地址起始页放在 x1
第8行调用函数 __enable_mmu 启用MMU,linux前期的那么多准备工作应该主要都是为这个函数做准备