嵌入式开发——uboot如何启动内核(以zImage详解)

2023-10-27

1、vmlinuz/vmlinux、Image、zImage与uImage的区别

参考博客:《vmlinuz/vmlinux、Image、zImage与uImage的区别》

uboot启动内核的大致步骤

(1)首先uboot要通过读取SD卡/flash等外存 或者 通过tftp、nfs等网络下载方式,将内核加载到内存的链接地址处;
(2)解析加载的内核的头信息,区分出当前启动方式是zImage、uImage还是设备树方式,构建出描述该内核的image_header_t结构体;
(3)将上一步得到的image_header_t结构体和内核所在地址传入do_bootm_linux函数,启动Linux内核;
(4)boot->bootm->do_bootm_linux->内核启动,uboot结束

2、加载内核镜像到DDR的链接地址处

2.1、内核有三种状态:

(1)静态:没有启动内核时,内核以镜像的方式存放在外存中;
(2)动态:内核在DDR中运行时;
(3)静态->动态:把内核从外存加载到DDR,并启动内核;

2.2、内核的重定位

内核从外存加载到DDR的过程就叫做重定位,必须加载DDR的特定地址(链接地址),因为启动的时候就是去链接地址启动。内核的重定位是uboot完成的,根据启动方式的不同,uboot可能从flash等外存去读取内核,也可能通过tftp、nfs等网络下载方式读取内核,但不管何种读取内核的方式,最终内核都是被加载到链接地址。链接地址在编译脚本、环境变量bootcmd、配置文件的CONFIG_BOOTCOMMAND宏定义可以查到。

3、启动内核的相关命令

(1)boot:该命令会先将内核重定位,然后调用bootm命令启动内核;
(2)bootm:这是直接启动内核的命令,只能启动已经加载到DDR的内核,在调用时传入内核在DDR中的地址(一般是内核的链接地址)即可启动内核。在bootm命令的实现代码里,其实主要完成的是启动方式的判断,判断出启动的操作系统类型后,完成初始化就会去调用相关操作系统的启动函数。
(2)do_bootm_linux函数:这是启动linux系统的函数,功能包括:准备给内核的传参、找到内核程序入口、启动内核。
补充:以上命令的详解可以参考博客: 《uboot启动内核的相关命令详解——boot、bootm》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发——uboot如何启动内核(以zImage详解) 的相关文章

  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • 套接字发送调用被阻塞很长时间

    我每 10 秒在套接字上发送 2 个字节的应用程序数据 阻塞 但发送调用在下面的最后一个实例中被阻塞超过 40 秒 2012 06 13 12 02 46 653417 信息 发送前 2012 06 13 12 02 46 653457 信
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似

随机推荐

  • python 安装第三方库,超时报错--Read timed out.

    Traceback most recent call last File home xiaoduc pyenv versions 3 5 0 lib python3 5 site packages pip vendor requests p
  • OpenGL天空盒skybox

    目录 痛彻的感悟 天空盒可能的难题 天空盒代码 痛彻的感悟 今天考完试才发现自己和别人的差距还挺大的 四五六班下午的考试题目 我很快做了出来 但是自己的班级的考试题目 我竟然一道都没有成功 所以我决定把我之前准备的代码公布一下 也希望对一些
  • 用Python写一个植物大战僵尸

    上次写了一个俄罗斯方块 感觉好像大家都看懂了 这次就更新一个植物大战僵尸吧 植物大战僵尸的话 Python源码 问题解答学习交流群 773162165 引入需要的模块 import pygame import random 配置图片地址 I
  • Spring中IOC详解

    一 IOC的原型 IOC 控制反转 比如我们有一个功能是获取用户数据 我们使用Dao层实现这个功能 再在Service层调用这个功能 但是我们每增加一个接口 比如获取mysql中的数据 就要修改原来的代码 如果再增加一个新的接口 又需要去s
  • 优质github项目集合-珍藏版

    这是是一个聚集优质github项目的整合 推荐收藏 宗旨 GitHubDaily 将于每日不定时推送一批 GitHub 上优秀的开源项目给开发者 帮助开发者们发现当下最火的开源项目 令开发者们得以掌控技术脉搏 扩大自己的技术视野 并从开源项
  • sharepoint 工作经验与技能总结

    可能是由于平时工作比较忙 博客也写得少了 最近偶尔被同行的同事朋友问起 我一直在做sharepoint方面的工作 没有打算换asp net C 方面的工作吗 有的还问了句网上很流行的话 你都会啥绝活 哈哈 被问多了之后 我也还真问自己 工作
  • 华为交换机、路由器设备怎样配置console登录密码

    华为交换机路由器设备怎样配置console密码 在对路由器交换机等网络进行管理中 为了安全起见经常需要为设备配置登录密码 尤其是使用串口线直连设备时 console线路密码认证有两种方式 1 只配置password 密码 2 aaa认证模式
  • 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现

    IAP在应用编程 In Application Programming 指的是MCU在运行应用程序时 能接收新的烧写文件 并更新到自身的程序存储器中 即可以在应用程序运行时在线升级 本节我们通过一个简单的例子 来实现STM32的IAP功能
  • 大数据学习笔记——zookeeper在hadoop集群中的作用

    zookeeper主要是用来搭建高可用的Hadoop集群 即High Availability 简称 HA 测试中集群是可以不需要高可用的 即使用一个namenode即可 但是在生产环境中为了提高集群的可靠性 需要增加一个namenode备
  • 遇到的有关的二进制的题目整理

    前n个数字二进制中1的个数 解答来自评论区大佬 如果正整数 i 是一个偶数 那么 i 相当于将 i 2 左移一位的结果 因此偶数 i 和 i 2 的二进制形式 1 的个数是一样的 如果 i 是奇数 那么 i 相当于将 i 2 左移一位之后再
  • MySQL索引在关联查询中的作用

    索引关联理解 inner join left join 如果是inner join的话 一边有索引就可以了 如果是left join 主表可以不用索引 但另外张就要索引 切记 小表驱动大表 给被驱动表建立索引 EXPLAIN语句分析出来的第
  • 【剑指 Offer】剑指 Offer 22. 链表中倒数第k个节点

    目录标题 算法汇总 题目 关键点 代码 1 解体方法 思路 代码 时间和空间复杂度 2 解题方法 如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总 包括GitHub源码地址链接 力扣算法练习汇总 持续更新 题目 剑指 O
  • 数据结构学习系列之单向链表的查找与修改

    单向链表的查找 根据单向链表数据结点的位置查找数据 代码如下 示例代码 int search link list node t phead int pos int data if NULL phead NULL data printf 入参
  • lua中使用json:table转json与json转table

    直接上代码 json lua JSON4Lua JSON encoding decoding support for the Lua language json Module Author Craig Mason Jones Homepag
  • 基于mybatis拦截器实现数据权限

    需求场景 业务要求对列表查询功能添加数据权限控制 比如 给用户A针对某些订单模块设置一些查询条件 比如地址 山东 运输方式 空运 商品大类 家电 当用户访问订单模块时 只能访问满足这些条件的数据 需求分析 要实现动态条件拼接 需要在执行查询
  • 解析LDO的基本原理与主要参数

    低压差线性稳压器 LDO 的基本电路如图1 1所示 该电路由串联调整管VT 取样电阻R1和R2 比较放大器A组成 取样电压加在比较器A的同相输入端 与加在反相输入端的基准电压Uref相比较 两者的差值经放大器A放大后 控制串联调整管的压降
  • 过滤器实现网站访问计数

    创建一个过滤器 实现网站访问计数器的功能 并在web xml文件的配置中将网站访问量的初始值设置为5000 创建名称为CountFilter的类 创建名称为CountFilter的类 该类实现javax servlet Filter接口 是
  • tf-faster-rcnn config.py 参数详解

    import os import os path as osp import numpy as np pip install easydict if you don t have it from easydict import EasyDi
  • Django 项目学习

    目录 一 环境问题 1 python环境安装 2 django安装 3 IDE选择 二 Django命令 实际使用在后面文章中介绍 三 Django项目和应用的关系 1 Django项目中目录介绍 3 Django应用中目录介绍 四 Dja
  • 嵌入式开发——uboot如何启动内核(以zImage详解)

    1 vmlinuz vmlinux Image zImage与uImage的区别 参考博客 vmlinuz vmlinux Image zImage与uImage的区别 uboot启动内核的大致步骤 1 首先uboot要通过读取SD卡 fl