首页 > 其他分享 >内核启动阶段获得dtb位置指针过程

内核启动阶段获得dtb位置指针过程

时间:2023-06-19 18:47:49浏览次数:36  
标签:__ UEFI bl dtb stext boot 内核 x0 指针

一.内核启动阶段获得dtb位置指针

arm64为例,内核启动如下:/arch/arm64/kernel/head.S

	__HEAD
_head:
	/*
	 * DO NOT MODIFY. Image header expected by Linux boot-loaders.
	 */
#ifdef CONFIG_EFI
	/*
	 * This add instruction has no meaningful effect except that
	 * its opcode forms the magic "MZ" signature required by UEFI.
	 */
	add	x13, x18, #0x16
	b	stext
#else
	b	stext				// branch to kernel start, magic
	.long	0				// reserved
#endif
...

在开启UEFI支持时,add x13,x18,#0x16这个code实际上是为了满足UEFI格式的"MZ"头。如果使用UEFI来启动kernel,会识别出来并走UEFI启动的流程,如果是普通的启动过程如使用uboot进行引导,那么第一条指令就是一条dummy指令,第二条就跳转到stext运行了。

x0寄存器保存的是dtb里blob块的物理地址,x0寄存器内容由uboot设置,uboot将dtb地址传递给内核,跳转到stext,如下:

ENTRY(stext)
  bl	preserve_boot_args
  bl	el2_setup			// Drop to EL1, w0=cpu_boot_mode
  adrp	x23, __PHYS_OFFSET
  and	x23, x23, MIN_KIMG_ALIGN - 1	// KASLR offset, defaults to 0
  bl	set_cpu_boot_mode_flag
  bl	__create_page_tables
  bl	__cpu_setup			// initialise processor
  b	__primary_switch
ENDPROC(stext)
...
preserve_boot_args:
  mov	x21, x0				// x21=FDT

  adr_l	x0, boot_args		// record the contents of
  stp	x21, x1, [x0]			// x0 .. x3 at kernel entry
  stp	x2, x3, [x0, #16]

  dmb	sy				// needed before dc ivac with
            // MMU off

  add	x1, x0, #0x20		// 4 x 8 bytes
  b	__inval_cache_range	// tail call
ENDPROC(preserve_boot_args)

arm64 linux寄存器规定如下:

标签:__,UEFI,bl,dtb,stext,boot,内核,x0,指针
From: https://www.cnblogs.com/caseyzq/p/17491895.html

相关文章

  • Git基础、Git指针、Git分支、Git标签
    什么是Git:它是一个分布式版本控制系统,支持断网操作,每个开发者都是一个仓库的完整克隆,每个人都是服务器         为什么要使用Git:它可以有效、高速的处理从很小到非常大的项目版本控制1.Git安装:   yum-yinstallgit  #使用yum安装Git           ......
  • 记录一次Java Convert Kotlin造成的空指针异常
    不知道大家在使用Kotlin进行编码的时候,有没有直接使用AS的Code->ConvertJavaFile2KotlinFile这个功能,此功能在日常使用中还是比较实用的,可以帮助我们将老的Java或者复制的Java代码一键转换成Kotlin代码,最近在使用此功能的时候竟然遇到了空指针的Crash,在此记录一下,顺便也给大......
  • C++多态的原理(虚函数指针和虚函数表) --imxiangzi 好好看
     C++多态的原理(虚函数指针和虚函数表)1.虚函数指针和虚函数表2.继承中的虚函数表2.1单继承中的虚函数表2.2多继承中的虚函数表3.多态的原理4.总结1.虚函数指针和虚函数表以下代码:问类实例化出的对象占几个字节?#include<iostream>usingnamespacestd;classA{ intm_a;publi......
  • 单链表(双指针)
    #include<stdio.h>#include<stdlib.h>#include<time.h>typedefstructNode{intvalue;structNode*pNext;}Node;/*打印链表*/voidshow_data(Node*head){if(head==NULL){return;}Node*cur=head;......
  • 阿里P7架构师整理:最新Android 开发源码精编内核解析
    做Android开发多年,我们都深知阅读源码的重要性,阅读源码可以帮助我们:①在通用型基础技术中提高技术能力,凸显出自己的技术实力;②在重点领域打造自己的亮点,参与技术栈的运维,积累丰富的使用经验,成为团队的核心骨干;③从优秀的源码中学习设计模式的应用,和有用的编码技巧。但是平时读源码......
  • linux2.6内核中如何添加新的文件系统
    《边干边学-linux内核指导》中教授了如何在2.4内核中添加myext2文件系统的方法。2.6内核中文件组织稍有变化,通过试验,方法如下:1.将fs/ext2拷贝一份为fs/myext22.cdfs/myext23.sed-i"s/ext2/myext2/g"*     //将fs/myext2目录下出现的所有ext2替换为myext24.sed-i"......
  • transform (牛客多校) (双指针+二分+ 中位数妙用+前缀和相减维护)
    题目大意:n个商店在一条直线上, 有一个xi然后有ai个商品你可以把商店的物品移动到另一个商店,代价为:abs(xi-xj)在代价不超过T的情况下你可以选择一个商店来让其他商店的物品都移到这个商店,问最多移动多少个物品  思路:双指针维护一个最大的区间,因......
  • C语言:指针
    1、指针简单介绍#include<stdio.h>intmain(void){int*p;//p是变量的名字,int*表示p变量存放的是int类型的地址(指针变量)/*int*p应该理解为p是变量名,p变量数据类型是int*类型,实际即使存放的是int变量地址的类型指针就是一个操作......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它......
  • C++面试八股文:聊一聊指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:面试官:聊一聊指针?二师兄:好的。面试官:你觉得指针本质上是什么?二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x00000000到0x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化......