arm64_linux启动流程分析02_保存启动信息
解上节, 我们先来看看bl preserve_boot_args
1 | preserve_boot_args: |
代码的含义一目了然, 把存fdt内存地址的x0保存到x21寄存器. 然后把启动参数x0, x1, x2, x3全部保存到boot_args数组中.
arm64 linux规定:
Primary CPU general-purpose register settings
x0 = physical address of device tree blob (dtb) in system RAM.
x1 = 0 (reserved for future use)
x2 = 0 (reserved for future use)
x3 = 0 (reserved for future use)
这里值得注意的有几点
- 这里有用到
adr_l
, arm64并没有这个指令, 这是一个宏
1 | .macro adr_l, dst, sym |
可以看到, 这里的adr_l
拆分成了两条指令, adrp + add, adrp指令最大寻址空间时+-4GB, 但是所寻址的地址是4KB对齐的. 所以这里在加了一个add指令来修正地址的低12bit, 从而实现了这个加载+-4GB任意位置的运行时地址的宏.
__inval_dcache_area
函数用来invalidate指定区域的dcache, 具体如下
1 | ENTRY(__inval_dcache_area) |
可以看到如果指定内存区域有跨越cacheline, 那么对两边跨越了cacheline的地址使用的clean + invalidate, 对于中间区域可以直接invalidate不用写回内存, 从而加快invalidate速度.