慢慢欣赏arm64内核启动25 primary_entry之__primary_switch代码第一部分

展示代码

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前期的那么多准备工作应该主要都是为这个函数做准备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值