Linux系统移植⑨:uboot启动流程详解-bootz启动Linux过程

Linux系统移植⑨:uboot启动流程详解-bootz启动Linux过程

bootz 是 U-Boot 中用于启动 Linux 内核的命令,专为处理 zImage(压缩内核映像) 设计。


启动 Linux 的完整过程:

1. 加载内核与相关文件

U-Boot 先将以下文件加载到内存指定地址:

  • zImage:压缩的 Linux 内核映像(位于内存地址 KERNEL_ADDR)。
  • 设备树二进制文件(DTB):硬件描述文件(位于 FDT_ADDR)。
  • initramfs(可选):初始内存文件系统(位于 INITRD_ADDR)。

2. 执行 bootz 命令

bootz [内核地址] [initramfs地址]:[大小] [设备树地址]

  • 启动命令

    bootz ${KERNEL_ADDR} ${INITRD_ADDR}:${INITRD_SIZE} ${FDT_ADDR}

    若无需 initramfs:
    bootz ${KERNEL_ADDR} - ${FDT_ADDR}

3. zImage 自解压

  • U-Boot 跳转到 KERNEL_ADDR,执行 zImage 头部的小型解压程序。
  • 解压程序将内核解压到预设的 物理内存地址(如 ARM 架构通常为 0x8000)。

4. 传递启动参数

U-Boot 通过寄存器/设备树传递关键参数:

架构寄存器参数说明
ARMr00(保留)
r1机器 ID(旧)或 0xFFFFFFFF(新)
r2设备树地址(FDT_ADDR
RISC-Va0设备树地址
a10(保留)

设备树(DTB) 包含 CPU、内存、外设等硬件信息,内核据此初始化硬件。


5. 内核初始化

Linux 内核接管后执行:

  1. 硬件初始化:基于 DTB 设置 CPU、内存控制器、时钟等。
  2. 驱动加载:识别并初始化存储、网络等设备驱动。
  3. 挂载根文件系统
    • 若有 initramfs,将其作为临时根文件系统。
    • 否则直接挂载 root= 参数指定的文件系统(如 /dev/mmcblk0p2)。

6. 用户空间启动

  1. 内核启动第一个用户进程 /init(位于 initramfs 或根文件系统)。
  2. init 进程加载系统服务(如 systemd 或 SysVinit)。
  3. 最终进入登录界面或指定应用。

关键依赖

  • zImage 格式:必须为 gzip 压缩的 Image 文件(非 uImage)。
  • 设备树支持:现代内核强制要求 DTB(无 DTB 的内核无法启动)。
  • 地址对齐:内核/DTB 的加载地址需符合 CPU 架构要求(如 ARM 需 4KB 对齐)。

do_bootz源码如下:

在这里插入图片描述

其内部主要函数调用关系如下:

do_bootz
-> bootz_start
-> do_bootm_states 阶段为BOOTM_STATE_START
-> bootm_start 对images全局变量清零,
-> images->ep = 0X80800000
->bootz_setup 判断zImage是否正确
-> bootm_find_images
-> boot_get_fdt 找到设备树,然后将设备树起始地址和长度,写入到images的ft_addr和ft_len成员变量中。
-> bootm_disable_interrupts 关闭中断相关
-> images.os.os = IH_OS_LINUX; 表示要启动Linux系统
-> do_bootm_states 状态BOOTM_STATE_OS_PREP 、BOOTM_STATE_OS_FAKE_GO 、BOOTM_STATE_OS_GO,
-> bootm_os_get_boot_func 查找Linux内核启动函数。找到Linux内核启动函数do_bootm_linux,赋值给boot_fn。
-> boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images); 就是do_bootm_linux。
-> boot_prep_linux 启动之前的一些工作,对于使用设备树来说,他会将Bootargs传递给Linux内核,通过设备树完成。也就是向Linux内核传参。
-> boot_selected_os BOOTM_STATE_OS_GO, do_bootm_linux
-> do_bootm_linux,BOOTM_STATE_OS_GO
-> boot_jump_linux
-> machid= gd->bd->bi_arch_number;
-> void (kernel_entry)(int zero, int arch, uint params);
-> kernel_entry = (void (
)(int, int, uint))images->ep; 0X80800000。
-> announce_and_cleanup 输出Starting kernel……
-> kernel_entry(0, machid, r2); 启动Linux内核。 Uboot的最终使命,启动Linux内核。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909748.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【R】基于R实现贝叶斯分析(一)

文章目录 贝叶斯简介Why R理论基础一、三种先验分布和对应后验的计算1. 离散先验2.Beta先验(共轭先验)3. 直方图先验 二. 后验抽样1. 网格点采样法2. 其他方法 三、贝叶斯推断1. 参数估计(1) 后验均值(2) 后验方差(3) 后验区间 2. 假设检验3. 预测(1) 先…

论文略读:Personality Alignment of Large Language Models

ICLR 2025 558 当前的大语言模型(LLMs)在对齐时,通常旨在反映普遍的人类价值观与行为模式,但却常常无法捕捉到个体用户的独特特征与偏好。 为填补这一空白,本文提出了**“人格对齐(Personality Alignment&…

JSON与XML怎么选?什么情况下会用到 JSON?

一、JSON 与 XML 的核心区别 从 语法、性能、适用场景 等维度对比,核心差异如下: 对比维度JSONXML语法结构键值对格式(如 {"name": "无线耳机"}),无标签,结构紧凑。标签嵌套格式&…

PCB设计实践(三十六)PCB设计新手系统性注意事项总结

以下是PCB设计的系统性注意事项总结,涵盖布局、布线、电源/地处理、EMC、制造工艺及验证等关键环节,依据行业规范与最佳实践整理: 一、布局设计规范 器件优先级策略 先固定接口器件(电源插座、连接器),锁定…

LangChain中的向量数据库抽象基类-VectorStore

文章目录 前言一、原型定义二、常用说明1、添加或更新文档2、添加或更新文本3、通过文档初始化VectorStore对象4、通过文本初始化VectorStore对象5、获得VectorStoreRetriever对象6、查询最相似的文档三、代码解析1、add_documents方法2、add_texts方法3、from_documents方法4、…

5G光网络新突破:<Light: Science Applications>报道可适应环境扰动的DRC实时校准技术

前言摘要 近日,国际顶尖光学期刊《Light: Science & Applications》刊登了一项来自中国国防科技大学研究团队的重要成果。该团队由姜天教授、张军教授和郝浩教授领衔,成员包括严秋全、欧阳灏(共同一作)等研究人员。他们提出了…

C++:Hash拓展--布隆过滤器

布隆过滤器 问题前景: 之前学习了位图,我们知道位图在大量数据查找时候是很方便的。但位图的缺陷在于只能用于整型数据。而在实际中,我们的数据更多的是更复杂的字符串或者自定义类型。那么此时位图就显得有点无力,所以就诞生了叫布隆过滤器…

快速了解JVM中的深堆与浅堆

在Java虚拟机(JVM)的内存管理世界里,深堆与浅堆是两个重要的概念。它们如同衡量对象内存占用的两把标尺,对于优化程序性能、排查内存泄漏问题起着关键作用。接下来,让我们快速且深入地了解它们。 一、浅堆&#xff08…

开疆智能ModbusTCP转Devicenet网关连接FANUC机器人配置案例

本案例是ModbusTCP主站通过开疆智能ModbusTCP转Devicenet网关连接发那科机器人的配置案例,操作分为三个配置1:ModbusTCP主站配置2:ModbusTCP转Devicenet网关配置3:FANUC机器人配置,具体过程如下 配置过程 主菜单—IO—…

详解RabbitMQ高级特性之发送方确认机制

目录 发送方确认 添加配置 常量类 声明队列和交换机并绑定二者关系 confirm确认模式 编写生产消息代码 生产消息1 解决方法 多次生产消息2 解决方法 生产消息3 return 模式 编写生产消息代码(路由正确) 生产消息1 编写生产消息代码&…

Google Play开发者账号8.3/10.3政策违规自救指南

最近,有一位开发者焦急地向我们诉说,其辛苦开发的多个应用,毫无征兆地全部下架,账户提示违反政策 8.3 和 10.3。经过连夜排查,原来是换皮应用与误导性描述导致的问题。 这并非个例,在 2024 年,G…

pythonday50

作业: 1.好好理解下resnet18的模型结构 2.尝试对vgg16cbam进行微调策略 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torchvision import models from torch.utils.d…

天猫618高增长背后:电商迈入价值战新周期

作者 | 曾响铃 文 | 响铃说 这次618,来“真”的了。 天猫618玩法变得极致简单,只设了“官方立减”的85折的基础优惠,再叠加行业品类券、国补等优惠,最高立减可达50%,十分直观。 让消费者省心的结果也是显而易见的&…

tauri+vue自动更新客户端打包配置

拉取最新代码打开项目根目录下"~.tauri\myapp.key"文件并复制内容 打开项目的powershell窗口,输入如下内容并回车 $env:TAURI_SIGNING_PRIVATE_KEY"复制的myapp.key" $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD""然后修改tauri.conf.…

硬件------51单片机

一.基本概念 1.裸机程序 BSP BSP:bord suppord pack 板级支持包 就是程序编写的内容是没有操作系统的,直接通过代码去控制寄存器,让硬件按照要求去工作。 主要内容:51单片机 IMAX6ULL 2.linux驱动部分 在裸机BSP程序的基础…

java 基础方法 list分页

新增一个list 泛型分类方法 hutools没这个方法, mybatis 里面的方法不好用 故新增此方法 package com.common.base.util.page;import lombok.Data;import java.util.List;/*** className: VoPage* description: list分页* author: chenyuanlong* date: 2025年6月16日 0016 上午…

操作系统期末复习--操作系统初识以及进程与线程

操作系统概念与主要功能 操作系统的概念 在信息化时代,软件是计算机系统的灵魂,而作为软件核心的操作系统,已与现代计算机系统密不可分、融为一体。计算机系统自下而上大致分为4部分:硬件、操作系统、应用程序和用户 操作系统管…

使用jhat查看dump.hprof文件内具体对象的属性值信息

jhat是JDK自带的堆转储分析工具,可以用来查看.hprof文件中对象的具体内容。本文演示使用的是JKD8. 一、启动jhat 执行启动命令。 jhat -J-Xmx4g your_heap_dump.hprof -J-Xmx4g表示为jhat分配4GB内存,根据你自己情况调整大小。your_heap_dump.hprof是…

freeRTOS之队列(queue)

一.概述 1.介绍 队列(queue)可以用于"任务到任务"、“任务到中断”、"中断到任务"直接传输信息。 2.核心功能 线程安全:自动处理多任务访问时的互斥问题。 数据复制:入队时复制数据(而非引用),…

【python】typing用法

一、基础类型提示 1. 基本类型注解 # 变量类型注解 age: int 30 name: str "Alice" is_student: bool False height: float 1.752. 函数注解 def greet(name: str, age: int) -> str:return f"Hello {name}, you are {age} years old!"二、组合类…