慢慢欣赏arm64内核启动1 primary_entry之保存启动参数

启动内核

我们反汇编内核后,然后看一下内核起始的地方

$ aarch64-none-linux-gnu-objdump -d vmlinux.o > vmlinux.txt

$ head vmlinux.txt 

vmlinux:     file format elf64-littleaarch64


Disassembly of section .head.text:

ffff800010000000 <_text>:
ffff800010000000:	91005a4d 	add	x13, x18, #0x16
ffff800010000004:	144bbfff 	b	ffff8000112f0000 <primary_entry>
	...

根据上一章节,bootloader将控制权交给内核,内核从__HEAD段的开头执行。该段的起始位置是_head

代码分析

_head

/*
 * Kernel startup entry point.
 * ---------------------------
 *
 * The requirements are:
 *   MMU = off, D-cache = off, I-cache = on or off,
 *   x0 = physical address to the FDT blob.
 *
 * This code is mostly position independent so you call this at
 * __pa(PAGE_OFFSET).
 *
 * Note that the callee-saved registers are used for storing variables
 * that are useful before the MMU is enabled. The allocations are described
 * in the entry routines.
 */
	__HEAD
_head:
	/*
	 * DO NOT MODIFY. Imag
### Linux ARM64 架构下的启动过程 #### 汇编代码解析 对于Linux ARM64架构,在`arch/arm64/kernel/head.S`文件中定义了内核启动流程[^1]。该文件包含了多个重要的函数和宏,用于完成从引导加载程序到操作系统内核的过渡。 在最开始的部分,通过`.head.text`段声明了一系列入口点以及初始化指令[^5]: ```assembly .section .head.text, "ax" .global __primary_switched __primary_switched: adr_x0, . bl primary_entry ``` 上述代码片段展示了如何定位并跳转至主要入口函数`primary_entry()`。这里利用相对寻址方式(`adr`)来获取当前PC寄存器值,并将其传递给参数x0;随后调用子程序分支命令(bl),执行实际的目标位置处的功能逻辑。 接着是几个关键步骤描述如下: - **保存启动参数**:为了确保后续能够访问到来自BootLoader传入的信息(如内存布局),会有一个名为`preserve_boot_args`的过程负责这项工作[^2]。 ```assembly preserve_boot_args: stp x0, x1, [sp, #-16]! // Save arguments on stack ... ``` - **配置CPU状态**:根据具体硬件平台的需求调整异常级别(EL)和其他必要的设置项,这通常由`el2_setup`和`set_cpu_boot_mode_flag`等处理单元承担。 - **创建初始页表结构**:这是为了让MMU可以正常运作而构建的基础数据结构之一,它允许虚拟地址空间映射物理资源。 - **使能MMU (Memory Management Unit)** :一旦完成了前面提到的各项准备工作之后,则可以通过特定序列激活存储管理部件,从而启用分页机制和支持更复杂的内存保护特性。 最后当一切准备就绪后,控制流将会转向C语言写的`start_kernel()`函数继续剩余部分的操作系统初始化任务。 #### 关于汇编与C交互的技术细节 由于ARM64体系结构不支持类似于ARM32中的某些伪指令形式,所以在编写涉及跨语言接口的地方时需要注意差异性[^4]。例如,在ARM32中有`ldr reg, =label`这样的语法可以直接引用符号地址,但在ARM64环境下则需采用其他方法间接达成相同效果,像使用ADR/ADRP组合加上ADD指令的方式计算偏移量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值