kernel启动流程-head.S的执行_3.preserve_boot_args
1.前言
kernel版本:5.10
平台:arm64
本专题主要基于《arm64_linux head.S的执行流程》系列文章,前者是基于3.18,本专题针对的是内核5.10。主要分析head.S的执行过程。本文主要记录head.S的preserve_boot_args执行过程。
2.preserve_boot_args
/* * Preserve the arguments passed by the bootloader in x0 .. x3 */
SYM_CODE_START_LOCAL(preserve_boot_args) mov x21, x0 // x21=FDT adr_l x0, boot_args // record the contents ofstp x21, x1, [x0] // x0 .. x3 at kernel entry stp x2, x3, [x0, #16] dmb sy // needed before dc ivac with // MMU off mov x1, #0x20 // 4 x 8 bytes b __inval_dcache_area // tail call
SYM_CODE_END(preserve_boot_args)
mov x21, x0
将x0的值(device tree的地址)暂存在x21寄存器中
adr_l x0, boot_args
将boot_args地址保存到x0
#arch/arm64/kernel/setup.c
/** The recorded values of x0 .. x3 upon kernel entry. */
u64 __cacheline_aligned boot_args[4];
在没有开启mmu的情况下,也没有创建页表,如何才能访问到boot_args,这里adr_l宏的定义如下:
/** Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where* <symbol> is within the range +/- 4 GB of the PC.*//* * @dst: destination register (64 bit wide)* @sym: name of the symbol*/.macro adr_l, dst, sym adrp \dst, \symadd \dst, \dst, :lo12:\sym.endm
此宏主要是通过adrp来实现,adrp得到一个大小为4KB的页的基址,而且在该页中有全局变量sym的地址;ADRP就是讲该页的基址存到寄存器dst中;
add指令会算出sym的地址,:lo12:\sym是一个偏移量;这样就得到了sym的地址dst;
引自:http://www.wowotech.net/215.html
由于MMU = off, D-cache = off,因此写入boot_args变量的操作都是略过data cache的,直接写入了RAM中
stp x21, x1, [x0]
stp x2, x3, [x0, #16]
将x21,x1,x2,x3保存到boot_args数组。
引自:http://www.wowotech.net/215.html
为何要保存x0~x3这四个寄存器呢?因为ARM64 boot protocol对启动时候的x0~x3这四个寄存器有严格的限制:x0是dtb的物理地址,x1~x3必须是0(非零值是保留将来使用)。在后续setup_arch函数执行的时候会访问boot_args并进行校验。
dmb sy
确保数据写入内存
b __inval_dcache_area
跳转到__inval_dcache_area执行无效cache操作
3. 总结
preserve_boot_args最主要的是将x21,x1,x2,x3保存到boot_args数组,x21保存着FDT的地址,x1,x2,x3保存bootloader传递的其它信息。由于MMU = off, D-cache = off,因此写入boot_args变量的操作都是略过data cache的,直接写入了RAM
参考文档
- http://www.wowotech.net/215.html
ARM64的启动过程之(一):内核第一个脚印 - Documentation/arm64/booting.txt
kernel启动流程-head.S的执行_3.preserve_boot_args相关推荐
- kernel启动流程-head.S的执行_4.el2_setup
目录 1.前言 2. el2_setup 选择栈 判断当前的异常级别 设置EL2端模式 设置EL0/EL1的端模式 VHE支持 Hyp configuration access physical ti ...
- kernel启动流程-start_kernel的执行_8.cpio initrd解包
目录 1. 前言 2. rootfs挂载 3.populate_rootfs 4.GotName的处理 参考文档 1. 前言 本专题文章承接之前<kernel启动流程_head.S的执行> ...
- [kernel 启动流程] 前篇——vmlinux.lds分析
https://blog.csdn.net/ooonebook/article/details/52690132 以下例子都以project X项目tiny210(s5pv210平台,armv7架构) ...
- 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)
[SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...
- I.MX6ULL_Linux_系统篇(21) kernel启动流程
链接脚本 vmlinux.lds 要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的.首先分析 Linux 内核的连接脚本文件 arch/arm/k ...
- Kernel 启动流程梳理
内核生命周期 uboot 打印完 Starting kernel . . .,就完成了自己的使命,控制权便交给了 kernel 的第一条指令,也就是下面这个函数 init/main.c asmlink ...
- uboot流程——uboot启动流程
[uboot] (第五章)uboot流程--uboot启动流程 2016年11月07日 20:12:07 阅读数:2230 以下例子都以project X项目tiny210(s5pv210平台,arm ...
- Linux Kernel系列一:开篇和Kernel启动概要
前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot ...
- [uboot] (第五章)uboot流程——uboot启动流程
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程( ...
最新文章
- SQL执行过程中的性能负载点
- ISE include 头文件错误的解决办法
- 微信小程序websocket聊天室
- python安装不上怎么办_python安装不了怎么办
- 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪
- iphone短信尚未送达_潮讯:iPhone12重大升级;华为麒麟被炒价;抖音上线云游戏;骚扰短信要凉了;一加刘作虎回归OPPO...
- HashSet存储元素保证唯一性的代码及图解
- 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
- ubuntu安装时出现11:资源暂时不可用
- 中断扫描方式子程序c语言,单片机原理及应用(C语言版) 第9章 节 单片机系统配置及接口.ppt...
- Linux 命令 大结
- 学科前沿讲座 神经网络,机器学习,深度学习
- 在Ubuntu 14.04上如何安装 WordPress 教程
- MT6627处理器芯片资料介绍
- 《离职申请表》交了后 在公司最后一天上班
- matlab 符号值转为实数,Matlab:在实现二进制到实数转换的公式时,无法获得唯一的有理数Part1...
- jk触发器改为四进制_四位二进制计数器这样接成十进制计数器
- zoj 3725 Painting Storages dp
- 小白如何制作一个微信小程序
- 二维码设计不得不知的小技巧!