[kernel 启动流程] (第四章)第一阶段之——dtb的验证

发布者:CrystalDawn最新更新时间:2025-02-08 来源: cnblogs关键字:kernel 手机看文章 扫描二维码
随时随地手机看文章

本文是基于arm平台。例子都是以tiny210(s5pv210 armv7)为基础的。
[kernel 启动流程]系列:

[kernel 启动流程] 前篇——vmlinux.lds分析
[kernel 启动流程] (第一章)概述
[kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断
[kernel 启动流程] (第三章)第一阶段之——proc info的获取
[kernel 启动流程] (第四章)第一阶段之——dtb的验证
[kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建
[kernel 启动流程] (第六章)第一阶段之——打开MMU
[kernel 启动流程] (第七章)第一阶段之——跳转到start_kernel
建议参考文档:

ARMV7官方数据手册
ARM的CP15协处理器寄存器
================================================

零、说明
本文是《[kernel 启动流程] (第一章)概述》的延伸,
阅读本文前建议先阅读《[kernel 启动流程] (第一章)概述》

1、kernel启动流程第一阶段简单说明
arch/arm/kernel/head.S

kernel入口地址对应stext
ENTRY(stext)
1
第一阶段要做的事情,也就是stext的实现内容

设置为SVC模式,关闭所有中断
获取CPU ID,提取相应的proc info
验证tags或者dtb
创建页表项
配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。
使能MMU
跳转到start_kernel,也就是跳转到第二阶段
本文要介绍的是“验证tags或者dtb的合法性”的部分。因为现在基本上很少使用atags,所以这里我们只说dtb的部分。

2、疑问
主要带着以下几个问题去理解

dtb是什么?为什么要验证dtb的合法性?
如何验证dtb的合法性?
3、对应代码实现
__HEAD
ENTRY(stext)
/*
* r1 = machine no, r2 = atags or dtb,
* r8 = phys_offset, r9 = cpuid, r10 = procinfo
*/
bl __vet_atags

一、DTB说明
这部分建议直接参考wowo的dtb的文章
Device Tree(一):背景介绍
Device Tree(二):基本概念
Device Tree(三):代码分析
简单说明,dtb里面存放了各种硬件信息,如果dtb有问题,会导致后续开机过程中读取的设备信息有问题而导致无法开机。

二、如何验证了一个dtb是否合法
1、原理说明
在生成dtb的时候会在头部上添加一个幻数magic,而验证dtb是否合法主要也就是看这个dtb的magic是否和预期的值一致。
2、dtb结构如下

结构体如下
DTB header
alignment gap
memory reserve map
alignment gap
device-tree structure
alignment gap
device-tree string
3、dtb header结构如下:

结构体如下
magic
totalsize
off_dt_struct
off_dt_strings
off_mem_rsvmap
version
……
其中,magic是一个固定的值,0xd00dfeed(大端)或者0xedfe0dd0(小端)。
以s5pv210-tiny210.dtb为例:
执行”hexdump -C s5pv210-tiny210.dtb | more”命令

@:dts$ hexdump -C s5pv210-tiny210.dtb | more
00000000 d0 0d fe ed 00 00 5a cc 00 00 00 38 00 00 58 14 |......Z....8..X.|
00000010 00 00 00 28 00 00 00 11 00 00 00 10 00 00 00 00 |...(............|

可以看到dtb的前面4个字节就是0xd00dfeed,也就是magic。
综上,我们只要提取待验证dtb的地址上的数据的前四个字节,与0xd00dfeed(大端)或者0xedfe0dd0(小端)进行比较,如果匹配的话,就说明对应待验证dtb就是一个合法的dtb。

三、代码分析
具体就是分析__vet_atags的实现。
通过《[kernel 启动流程] (第一章)概述》,我们已经知道r2上存放的是dtb的地址指针,而代码中所要做的,就是要通过这个地址指针,获取前四个字节,去和dtb应有的幻数,也就是0xd00dfeed(大端)或者0xedfe0dd0(小端)进行比较。匹配的话,则说明这是一个合法的dtb。
代码如下(省略了验证atags的部分):
arch/arm/kernel/head-common.S

__vet_atags:
tst r2, #0x3 @ aligned?保证dtb的地址是四字节对齐的
bne 1f

ldr r5, [r2, #0] @获取dtb的前四个字节,存放在r5寄存器中
#ifdef CONFIG_OF_FLATTREE
ldr r6, =OF_DT_MAGIC @ is it a DTB?,获取dtb的幻数,0xd00dfeed(大端)或者0xedfe0dd0(小端)
cmp r5, r6 @前四个字节和幻数进行对比
beq 2f @匹配,则说明是一个合法的dtb文件,跳到2
#endif
bne 1f @不匹配,跳到1

2: ret lr @ atag/dtb pointer is ok,直接返回,此时r2存放了dtb的地址

1: mov r2, #0@错误返回,此时,r2上是0
ret lr
ENDPROC(__vet_atags)

DTB的幻数,也就是OF_DT_MAGIC定义如下:
arch/arm/kernel/head-common.S

#ifdef CONFIG_CPU_BIG_ENDIAN
#define OF_DT_MAGIC 0xd00dfeed
#else
#define OF_DT_MAGIC 0xedfe0dd0 /* 0xd00dfeed in big-endian */
#endif

综上,验证dtb的工作完成。


关键字:kernel 引用地址:[kernel 启动流程] (第四章)第一阶段之——dtb的验证

上一篇:代码示例_非阻塞IO
下一篇:[kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建

推荐阅读最新更新时间:2026-03-20 11:59

[kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建
本文是基于arm平台。例子都是以tiny210(s5pv210 armv7)为基础的。 系列: 前篇——vmlinux.lds分析 (第一章)概述 (第二章)第一阶段之——设置SVC、关闭中断 (第三章)第一阶段之——proc info的获取 (第四章)第一阶段之——dtb的验证 (第五章)第一阶段之——临时内核页表的创建 (第六章)第一阶段之——打开MMU (第七章)第一阶段之——跳转到start_kernel 建议参考文档: ARMV7官方数据手册 ARM的CP15协处理器的寄存器 ================================================ 零、说明 本文是《 (第一章)
[单片机]
STM32MP1xx启动流程详解
根据提供的知识库内容,以下是STM32 MPU启动链的详细解析: 1. 通用启动流程 STM32 MPU启动分为多阶段,逐步初始化外设和内存,并建立信任链: 1.1 ROM代码(BootROM) 作用:首个执行的代码,选择启动设备(串口/闪存),加载FSBL到内部RAM。 安全:验证FSBL的完整性,建立信任链的起点。 存储:固化在芯片ROM中,体积小(几十KB)。 1.2 第一级引导程序(FSBL) 功能:初始化时钟树、DDR控制器,加载SSBL到外部RAM。 实现:STM32MP13/15使用TF-A BL2(Trusted Firmware-A)作为FSBL。 安全:可选认证,支持解密和验证后续组件。 1.3 第二级引导程序
[单片机]
【IMX6ULL学习笔记】八、Linux启动流程
一、链接脚本 vmlinux.lds Linux 内核的链接脚本文件 arch/arm/kernel/vmlinux.lds 中有如下代码: ENTRY 指明了了 Linux 内核入口,入口为 stext,stext 定义在文件 arch/arm/kernel/head.S 中。 二、Linux 内核启动流程分析 1、Linux 内核入口 stext stext 是 Linux 内核的入口地址,在文件 arch/arm/kernel/head.S 中有如下所示提示内容: /* * Kernel startup entry point. * --------------------------- * * This is
[单片机]
【IMX6ULL学习笔记】八、Linux<font color='red'>启动</font><font color='red'>流程</font>
STM32F10X启动流程
总体流程 1.初始化堆栈指针 SP=_initial_sp,初始化 PC指针=Reset_Handler 2.初始化中断向量表 3.配置系统 4.调用 C库函数_main初始化用户堆栈,然后进入 main函数。 STM32三种启动流程 mode=0x 从flash 启动,正常模式 mode=10 从系统存储器启动 串口下载程序模式 mode=11 内置SRAM 启动 用于程序调试 ;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************;* File Name : startup_stm32f10x
[单片机]
(七)u-boot2013.01.01 for s5pv210:《u-boot启动流程
1.关于启动流程 1.1 启动阶段分为3个,bl0,bl1,bl2。下面只是就功能方面对它们做说明,实际设计的时候,也许会对其具体功能做出调整,也就是说,这几个阶段的划分是就功能而言的,不能看得太死。 bl0:出厂的时候就固化在irom中一段代码,主要负责拷贝8kb的bl1到s5pv210的一个96kb大小内部sram(Internal SRAM)中运行。值得注意的是s5pv210的Internal SRAM支持的bl1的大小可以达到16kb,容量的扩增是为了适应bootloder变得越来复杂而做的。虽然如此,但目前我们制作出来的bl1的大小仍然可以保持在8kb以内,同样能满足需求。 bl1:u-boot的前8kb代
[单片机]
(七)u-boot2013.01.01 for s5pv210:《u-boot<font color='red'>启动</font><font color='red'>流程</font>》
s3c6410 完全由SD卡启动Linux流程
1. s3c6410 SD启动原理 s3c6410 支持Nand Flash本地启动Linux,包括内核,根文件系统,bootloader均写入在Nand Flash.这样可以独立运行. 很多情况下,Nand Flash的某种原因无法写入内核和Rootfs.而使用tftp下载内核,用NFS启动根文件系统比较慢.s3c6410 支持 SD卡启动,经过改造u-boot可以从SD卡引导内核,这样而Linux 又可以从SD卡的装载ext3根文件系统.这样可以制作一个完整的SD卡启动卡. 这样bootloader(u-boot)可以写入SD卡,引导扇区. bootloader的第一阶段把自己装入在内存高端地址看后,可以用两
[单片机]
ARM-Linux移植之(三)——init进程启动流程分析
我们通常使用Busybox来构建根文件系统的必要的应用程序。Busybox通过传入的参数来决定执行何种操作。当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分析这个函数,看init进程究竟是怎样一个流程。我分析的Busybox源码是1.7.0版本的,其他版本会略有不同。部分代码省略我们只看关键性代码。 首先看init_main函数 int init_main(int argc, char **argv); int init_main(int argc, char **argv) { …………………………….. …………………………….. //初始化控制台 console_i
[单片机]
S5PV210 启动流程
S3C6410启动流程 首先,看一下S3C6410启动流程 ① iROM supports initial boot up : initialize system clock, D-TCM, device specific controller and booting device. ② iROM boot codes can load 4KB of bootloader to stepping stone. The 8KB boot loader is called BL1. ③ BL1: BL1 can initialize system clock, UART, and SDRAM for user. After ini
[单片机]
S5PV210 <font color='red'>启动</font><font color='red'>流程</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved