- ② boot_jump_linux

文章插图
以上是boot_jump_linux的片段代码,可以看出:若使用DTB,则原先用来存储ATAG的寄存器R2,将会用来存储.dtb镜像地址 。
boot_jump_linux最后将调用kernel_entry,将.dtb镜像地址传给内核 。
下面我们来看下内核的处理部分:
在arch/arm/kernel/head.S中,有这样一段:

文章插图
_vet_atags定义在
/arch/arm/kernel/head-common.S中,它主要对DTB镜像做了一个简单的校验 。

文章插图
真正解析处理dbt的开始部分,是setup_arch->setup_machine_fdt 。这部分的处理在第五部分的machine_mdesc中有提及 。

文章插图
如图,是setup_machine_fdt中的解析过程 。
- 解析chosen节点将对boot_command_line进行初始化 。
- 解析根节点的{size,address}将对dt_root_size_cells,dt_root_addr_cells进行初始化 。为之后解析memory等其他节点提供依据 。
- 解析memory节点,将会把节点中描述的内存,加入memory的bank 。为之后的内存初始化提供条件 。
- 解析设备树在函数unflatten_device_tree中完成,它将.dtb解析成device_node结构(第五部分有其定义),并构成单项链表,以供OF的API接口使用 。

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图

文章插图
总的归纳为:
① kernel入口处获取到uboot传过来的.dtb镜像的基地址
② 通过early_init_dt_scan()函数来获取kernel初始化时需要的bootargs和cmd_line等系统引导参数 。
③ 调用unflatten_device_tree函数来解析dtb文件,构建一个由device_node结构连接而成的单向链表,并使用全局变量of_allnodes保存这个链表的头指针 。
④ 内核调用OF的API接口,获取of_allnodes链表信息来初始化内核其他子系统、设备等 。
推荐阅读
- CentOS继任者Rocky Linux 8.5新特性
- 小白黑客如何使用Kali Linux中间人获取内网计算机图片信息
- Intel|首次使用EUV工艺 Intel “4nm”酷睿点亮:成功运行Win/Linux/Chrome三大系统
- Linux 中 ss 命令的使用实例
- Linux内存占用常用的几个分析方法,你确定都知道?
- Linux用户及权限管理
- 新手必须掌握的linux命令
- linux内核--自旋锁的理解
- 使用MobaXterm管理远程Linux服务器
- linux smb漏洞?SMB协议漏洞
