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

参考文档

  1. http://www.wowotech.net/215.html
    ARM64的启动过程之(一):内核第一个脚印
  2. Documentation/arm64/booting.txt

kernel启动流程-head.S的执行_3.preserve_boot_args相关推荐

  1. kernel启动流程-head.S的执行_4.el2_setup

    目录 1.前言 2. el2_setup 选择栈 判断当前的异常级别 设置EL2端模式 设置EL0/EL1的端模式 VHE支持 Hyp configuration access physical ti ...

  2. kernel启动流程-start_kernel的执行_8.cpio initrd解包

    目录 1. 前言 2. rootfs挂载 3.populate_rootfs 4.GotName的处理 参考文档 1. 前言 本专题文章承接之前<kernel启动流程_head.S的执行> ...

  3. [kernel 启动流程] 前篇——vmlinux.lds分析

    https://blog.csdn.net/ooonebook/article/details/52690132 以下例子都以project X项目tiny210(s5pv210平台,armv7架构) ...

  4. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  5. I.MX6ULL_Linux_系统篇(21) kernel启动流程

    链接脚本 vmlinux.lds 要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的.首先分析 Linux 内核的连接脚本文件 arch/arm/k ...

  6. Kernel 启动流程梳理

    内核生命周期 uboot 打印完 Starting kernel . . .,就完成了自己的使命,控制权便交给了 kernel 的第一条指令,也就是下面这个函数 init/main.c asmlink ...

  7. uboot流程——uboot启动流程

    [uboot] (第五章)uboot流程--uboot启动流程 2016年11月07日 20:12:07 阅读数:2230 以下例子都以project X项目tiny210(s5pv210平台,arm ...

  8. Linux Kernel系列一:开篇和Kernel启动概要

    前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot ...

  9. [uboot] (第五章)uboot流程——uboot启动流程

    以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程( ...

最新文章

  1. SQL执行过程中的性能负载点
  2. ISE include 头文件错误的解决办法
  3. 微信小程序websocket聊天室
  4. python安装不上怎么办_python安装不了怎么办
  5. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪
  6. iphone短信尚未送达_潮讯:iPhone12重大升级;华为麒麟被炒价;抖音上线云游戏;骚扰短信要凉了;一加刘作虎回归OPPO...
  7. HashSet存储元素保证唯一性的代码及图解
  8. 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
  9. ubuntu安装时出现11:资源暂时不可用
  10. 中断扫描方式子程序c语言,单片机原理及应用(C语言版) 第9章 节 单片机系统配置及接口.ppt...
  11. Linux 命令 大结
  12. 学科前沿讲座 神经网络,机器学习,深度学习
  13. 在Ubuntu 14.04上如何安装 WordPress 教程
  14. MT6627处理器芯片资料介绍
  15. 《离职申请表》交了后 在公司最后一天上班
  16. matlab 符号值转为实数,Matlab:在实现二进制到实数转换的公式时,无法获得唯一的有理数Part1...
  17. jk触发器改为四进制_四位二进制计数器这样接成十进制计数器
  18. zoj 3725 Painting Storages dp
  19. 小白如何制作一个微信小程序
  20. 二维码设计不得不知的小技巧!

热门文章

  1. python pandas读取excel时动态确定标题行所在行数
  2. rk3288驱动调试
  3. 在Linux系统中访问虚拟机的数据库和访问Windows(本机)下的数据库:
  4. python求三位数的最大公约数和最小公倍数(3种算法)
  5. unix系统病毒概述(转)
  6. 嵌入式软件的调试工具
  7. 敏捷实践之回顾会议Retro
  8. 【怎么制作电子画册】云展网教程 | 如何设置默认模版
  9. OCR图片转文字两种python方法实现
  10. 永恒python图片_第1章 python基础