嵌入式系统学习(七)-bootloader修改实例

2023-11-02

从 github 中下载 Nanopi2 的 uboot 源码后,从源代码根目录中找到 u-boot.lds 文件,可以看到以下内容:


以上片断可以分析出,整个 uboot 程序从 arch/arm/cpu/slsiap/s5p4418/start.o 开始执行,且执行的入口为 _stext。

打开 arch/arm/cpu/slsiap/s5p4418/start.S,在第 20 行找到入口:

入口的内容是用户异常向量表,根据第一个表项,可以找到复位向量入口 reset。该入口在同一文件的第76 行。

由于代码较长,这里仅对关键步骤进行分析。

* 将 CPU 设置为 SVC32 模式。

* 初始化 CP15 协处理器。

这里的初始化包括禁用一级的 I-Cache和 D-Cache。禁用 MMU。

* 在 91 行处进行跳转,进入 lowlevel_init 入口,开始板级特定的初始化。 lowlevel_init入口位于 arch/arm/cpu/slsiap/s5p4418/low_init.S 中。初始化内容包含获取 cpu id 等等。初始化完毕后,跳转回 start.S 的第 100 行继续执行。

接下来的步骤是确定运行环境,即 uboot目前是运行在 Flash 中还是在 DRAM中。如果是运行在 DRAM 中,则初始化 bss 段为 0,开启 mmu(开启的代码在arch/arm/cpu/slsiap/s5p4418/mmu_asm.S 和arch/arm/cpu/slsiap/s5p4418/mmu.c),重新初始化栈指针,并在第 140 行跳转 到board_init_f 入口执行。

board_init_f 入口在 commom/board_f.c,由于已经重新初始化栈指针,因 此 c 语言环境已经搭建好。board_init_f 则以 c 语言编写。函数返回时,返回 至 start.S 的第 142 行继续执行。初始化led,重新初始化串口,初始化堆,初 始化 mmc 通道,初始化环境变量,初始化控制台,初始化中断系统并启动它。

然后运行至第 156 行时,跳转至 board_init_r 入口。该入口在commom/board_r.c 中,亦以 c 语言编写。在这阶段中,uboot 识别 flash 空间长 度,初始化 led,重新初始化串口,初始化堆,初始化 mmc 通道,初始化环境变 量,初始化控制台,初始化中断系统并启动它。最后到 927 行运行run_main_loop(),最终调用 main_loop()。这个函数位于 commom/main.c 中。 以下就是 main_loop()的代码。

在这个函数里,最关键的一句是 autoboot_command(s); 这一个函数主要用 于延时启动内核。即延时 3 秒,若 3 秒内用户按下任意按键,则进入 uboot 的命 令行模式,否则就自动启动内核。进入 commom/autoboot.c 中的 autoboot_command(),如下图所示:

里面的 abortboot()函数就是延时中断启动系统的检测。如果在延时启动中 没 有 任 何 按 键 按 下 , 则 运 行 run_command_list 执 行 内 核 的 引 导 。 run_command_list()是一系列命令的解析过程。

解析时,调用过程如下:

*  commom/cmd_bootm.c 中的 do_bootm()

*  commom/bootm.c 中的 do_bootm_states()

*  commom/bootm_os.c 中的 boot_selected_os()

在 boot_selected_os()中,调用了一个函数,叫 boot_fn()。经过追踪, boot_fn()被定位到 arch/arm/lib/bootm.c 中的 do_bootm_linux()。

在这里有一个关键的函数 boot_jump_linux()。其实现如下图所示:


到这里可以清楚地看到,该函数为引导系统通过 announce_and_cleanup() 做了些初始化工作,最终通过调用 kernel_entry()来启动 linux 系统。到这里 为止,整个 uboot 就完成了所有工作,让出控制权。

上述的整个过程,都有特定的输出,如下图所示。



对 TF 卡烧写分区进行详细说明, 即 bootloader 地址,内核的地址以及文件系统的地址等。以烧写 Debian 系统为例,根据烧写脚本 fusing.sh 和 partmap.txt 可以看 出,在 TF 卡上,有以下的分区,每个分区各包含不同的内容:

分区起始地址

内容

0x0000_0000

MBR

0x0000_0200

NISH

0x0000_0400

2ndboot

0x0000_8000

NISH

0x0000_8200

UBoot

0x0010_0000

Boot 分区(包含内核)

0x0410_0000

根文件系统分区

由于 Boot 分区是 ext4 文件系统,而且内核是位于 Boot 分区上,因此内核并没有固定的烧写地址。

对在内存运 行地址进行详细说明,即 bootloader 地址,内核的地址以及文件系统的地 址等。根据 2ndboot 输出的内容可以猜测, 2ndboot 将 UBoot 复制到内存 0x42C0_0000 后继续执行。而在 Uboot 的代码中,可以查看到内核启动的环境变 量 bootargs。该变量指示了 UBoot 将内核 uImage.hdmi从 TF 卡的 ext4 文件系 统中复制到内存 0x4800_0000 的位置,而根文件系统则从 TF 卡的 ext4 文件系统 中复制到内存 0x4900_0000 的位置。最后从 0x4800_0000 开始启动内核。

内存起始地址

内容

0x42C0_0000

UBoot

0x4800_0000

内核:uImage.hdmi

0x4900_0000

文件系统:root.img

在 bootloader 启动显示中,添加个人信息实例:

(1)在 UBoot 目录下的 common/main.c 中找到 main_loop()函数,在该函数中找到 autoboot_command(s);一句。在该语句上面添加显示信息,如下图红框所示。

添加完毕后,重新编译 uboot,得到 uboot.bin。将 uboot.bin 烧写到 SD 卡中,并启动开发板,可以在启动过程中看到添加的信息,如下图红框所示。



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

嵌入式系统学习(七)-bootloader修改实例 的相关文章

  • 正点原子IM6XULL阿尔法USB摄像头的远程调用(一)硬件连接

    正点原子IMX6ULL阿尔法USB摄像头的远程调用 一 硬件连接 话不多说 直接上货 1 用电源线连接电源 如图所示 2 利用USB接串口线将板子和电脑相连 电脑用U口 板子用USB UART口 如图所示 3 按开机键开机 如图所示 4 从
  • 数据清洗实例分析

    一 数据清洗工作 数据清洗 如填充缺失数据 消除噪声数据等 主要是通过分析 脏数据 的产生原因和存在形式 利用现有的数据挖掘手段和方法去清洗 脏数据 将 脏数据 转化为满足数据质量要求或应用要求的数据 从而提高数据集的质量 满足现阶段数据分
  • 递归查询与迭代查询实例说明

    转载请注明来源 作者 loongshawn http blog csdn net loongshawn article details 55261897 建议读者阅读原文 确保获得完整的信息 1 定义说明 熟悉几个概念 循环 loop 最基
  • S7-200SMART案例分析——步进顺控以及替代方案

    这一篇文章我们以一个非常简单的小例子来说明步进顺控的用法 以及优缺点 我们会使用三种方式来写这个小例子 思路都是一步一步执行程序 但是代码完全不一样 例子为顺序点亮三盏灯并且全部点亮后再依次熄灭 间隔时间我们假定1秒 然后循环往复 第一种方
  • ubuntu18.04 配置nfs服务

    1 安装nfs服务器软件 sudo apt install nfs kernel server 2 修改配置文件 添加nfs server上用于共享的目录 并设置允许访问该目录的客户机IP 及其读写权限 sudo vim etc expor
  • 修复nanopi2的SPI无法使用50MHZ传输的问题(S5P4418)

    关于S5P4418使用SPI DMA传输时出现的超时问题 一 问题背景 二 启用SPI的DMA传输 2 1 修改cfg main h 文件 2 2 make menuconfig 配置SPI 2 3 修改SPI主机驱动代码 2 4 增加设备
  • 正点原子IMX6ULL阿尔法USB摄像头的远程调用(五)配带口罩检测

    本文介绍的是利用网上开源的配带口罩检测算法 结合IMX6ULL的USB摄像头制作一个小系统 首先向开源团队致敬 这个太强了 一共包括了大概有六七种检测方式 每一种识别率就很高 棒棒的 源码下载 源码地址 https gitee com mi
  • Mybatis使用实例

  • 嵌入式系统之cyber-physical system

    嵌入式系统在生活中随处可见 之前的嵌入式做法一般都是在一些现成的板子上移植linux做一些剪切加一些传感器写一些设备驱动 都是随着时代的发展 嵌入式不再是之前大家认为的那种单片机原理 其实现在很多人都把搞单片机弄的那一套认为是嵌入式 当然业
  • TCP套接字网络编程实例(二)

    TCP套接字网络编程实例 二 采用多线程实现客户端和服务器的聊天功能 OK 上代码 1 客户端部分 文件 tcp client c 内容 利用TCP实现客户端和服务器的实时聊天 注 服务器的端口号及IP 客户端的端口号及IP的输入通过mai
  • Java socket通信实例,简单入门socket实例代码

    是不是看了许多socket入门知识 却还是不能实际运用呢 这篇文章通过利用简单实例程序讲解通过socket实现客户端与服务器之间的通讯 这篇文章可以让你不需要了解socket原理也能利用 便于应急 但建议之后要好好补补关于soket的基础知
  • AD常用快捷键记录

    一 通用快捷键 1 放大缩小 常用方法 ctrl 鼠标滚轮 鼠标中键 移动鼠标 pgup pgup 2 切换不同的布线层 ctrl shift 鼠标滚轮 3 在SCH或者PCB 同一平面内左右翻转 ctrl X 4 在SCH或者PCB 同一
  • MOS管电源开关电路的软启动

    https mp weixin qq com s 5W8rveh69XVzJoRX XrSfgbeizhu 仅用于标注 适用于我这样的硬件小白
  • Android adb等 获取root权限

    Android adb 获取root权限 1 自己编译的Android 中 adb shell后 自动获取root权限 即显示 而不是 方法 修改 default prop 把ro secure设为0 persist service adb
  • ARM常用汇编指令汇总

    ARM常用汇编指令汇总 text表示代码段 data初始化的数据段 bss未初始化的数据段 rodata只读数据段 global表示全局变量 CPSR寄存器数据访问 指令 目的 源 描述 MRS R0 CPSR 将CPSR的数据放到R0中
  • WIN10超级终端下载链接及使用教程

    地址见文末 1 直接运行 随便命名 2选择连接的COM口 3 选择对应的波特率 我的是115200 数据流控制选择无 4点击应用 给开发板上电即可 链接一 https pan baidu com s 1iDf16H8BsZ53lOVqmQO
  • JSON.stringify 语法实例讲解

    语法 JSON stringify value replacer space value 是必选字段 就是你输入的对象 比如数组 类等 replacer 这个是可选的 它又分为2种方式 一种是数组 第二种是方法 情况一 replacer为数
  • Dictionary字典的用法及用途原理

    Dictionary 实例化Dictionary private Dictionary
  • Clion2021的安装并实现stm32F103点亮LED

    CLion是Jetbrains公司旗下新推出的一款专为开发C C 所设计的跨平台IDE 它是以IntelliJ为基础设计的 同时还包含了许多智能功能来提高开发人员的生产力 CLion专为使用C和C 以及 Kotlin Native Rust
  • 【QT】:QT实现一个信号与多个槽的关联和实现多个信号与一个槽的关联

    这个问题很简单 我们定义一个按钮就是一个信号 而相应的事件就是一个槽 而这里用到的方法就是connect connect的两个实例如下 connect ui gt pushButton 3 SIGNAL clicked this SLOT

随机推荐

  • unity C# 使用 action实现函数回调和 委托(Delegate)

    一 C 使用 action实现函数回调 1 1 声明一个方法 这个方法需要传递进去一个函数 并且这个传递进去的函数也是需要参数的 我们把它声明为Action
  • unity 计时器

    unity 计数器 计时器就是在游戏界面的时间 可以是一个正计时 也可以是倒计时 现在简单分享一下简单的计时代码 private void Update totalTime Time deltaTime if totalTime lt 0
  • SpringCloud的搭建

    SpringCloud的搭建 源码 Eureka的创建步骤 最终版为2021 5 23版本 每次提交对应下面的一个步骤 1 Eureka保证AP 2 Eureka的使用 Ribbon的使用步骤 最终版为2021 5 24版本 每次提交对应下
  • Hive SQL中的lateral view explode

    公众号后台回复 图书 了解更多号主新书内容 作者 胖里 来源 胖里的日常 标题中直接写lateral view explode是我鲁莽了 毕竟这俩不是法定cp 也并不是不能分开各自生活 其中explode可以放在select从句中单独使用
  • android ScrollView 嵌套RecyclerView 解决滑动冲突

    为了解决滑动事件的冲突需要重写ScrollView Copyright 2014 Soichiro Kashima Licensed under the Apache License Version 2 0 the License you
  • 【Linux

    目录 一 判断文件是否存在 1 1 判断目录是否存在 1 2 判断文件是否存在 1 3 其他文件类型判断 二 字符串截取 去掉文件后缀 2 1 获取文件后缀 2 2 获取文件前缀 在Linux编程过程中 设计到对文件的处理时常常需要判断某个
  • 远程调试运行在Resin上面的Web应用程序

    为什么80 的码农都做不了架构师 gt gt gt 有时候 我们不得不放弃在本地调试我们的程序 把我们的程序先布署到服务器 然后把调试信息都记在日志中 用眼睛瞅日志来调试程序 不是用这种方式不行 只是效率太低 本来写程序是一件开心的事情 却
  • UE4数字孪生项目制作规范

    UE数字孪生项目制作规范 说明 协同 规范 说明 UnrealEngine项目 打包输出Window应用 鼠标操作 键盘快捷键操作 协同 内部开发的可以自己内网搭建svn服务器协同开发 如有外部人员参与项目开发 则项目协同可使用svnbuc
  • Spring Boot:jar中没有主清单属性

    D hu git spring xxx xxx target gt java jar spring cloud eureka 0 0 1 SNAPS HOT jar spring xxx xxx 0 0 1 SNAPSHOT jar中没有主
  • 数据库的背景知识及基本概念

    数据库的背景知识及基本概念 随着互联网技术的高速发展 大量的数据正在不断产生 伴随而来的是如何安全有效的存储 检索 管理他们 使用数据库可以高效且条理分明地存储数据 它使人们能够更加迅速和方便管理数据 主要体现一下几个方面 可以结构化存储大
  • 奥迪A6 C5空调制冷效果差维修

    一台2003年出厂的一汽奥迪A6 C5 2 8L轿车 装备BBG发动机及双区自动空调 行驶约159000公里 该车空调制冷效果差 空调面板设定22度 用手感知出风口温度 凉 但不够凉 压缩机离合器正常吸合 皮带盘正常运行 连接空调歧管压力表
  • 从零读懂CAN总线(上)

    概要 上世纪八十年代以来 汽车ECU越来越多 如ABS 电控门窗 电子燃油喷射装置 如果仍然采用常规的点对点布线方式 即电线一段与开关相接 另一端与用电设备相通 将会导致车上电线数目的急剧增加 从而带来线束的冗余及维修成本的提高 这就对汽车
  • Gorm系列之1

    Gorm系列之1 特别指出 特别指出的是 该系列基础代码来自git上的开源项目7days golang 项目地址 https github com geektutu 7days golang 原项目作者 极客兔兔 个人主页 https ge
  • 网络面试题及答案

    1 标准网络线的颜色排列顺序 568B 橙白 橙 绿白 蓝 蓝白 绿 棕白 棕 568A 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕 直通线一般都用 A线序或 B线序 交叉线一端是 568A 一端 是 568B 2 按照数据访问速度排序 硬盘
  • linux内存调试工具集

    除了GDB以外 linux还提供了很多的内存调试工具 注意 以下工具的使用之前 gcc需要使用 g编译出带符号的elf 1 addr2line 用于将可执行文件的虚拟内存地址或者动态库的偏移量转换成函数以及代码行 动态库的偏移量计算方式 将
  • 用python和计算机对话(计算机的语句)

    计算机中的的语句 编程其实就是一个把人类语言转换成计算机语言的过程 再知道每个字是什么意思后 就要把它连成一句话 这样它便有了意义 程序便是由这样一句一句的计算机语句组成的 那么计算机语句都有哪些呢 1 if else语句 if是如果的意思
  • 字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

    本人211非科班 之前在字节和腾讯实习过 这次其实没抱着什么特别大的希望投递 没想到字节可以再给我一次机会 还是挺开心的 本来以为有个机会就不错啦 没想到能成功上岸 在这里要特别感谢帮我内推的同学 中间投递比较曲折 是他帮了我很多 非常负责
  • onlyoffice文档服务器加载慢,【onlyoffice中文指南】12-问题及排除

    作者 日期 雨中星辰 2018 12 20 故障排除 编辑器集成中最常见的问题及解决方法 下载失败 Download failed 下载失败 编辑器加载过程中将显示 下载失败 消息 该文档编辑服务不能上传文件进行编辑 检查document
  • Android自定义View完美实现指示器位置随进度变化的IndicateProgressView

    该文章同步发布在公众号 LinminTech 上 请在本文最后扫码关注 获取更多精彩Android开发文章 效果图 需求 在平时开发过程中 UI经常要求实现如上图所示的ProgressBar 但是Android系统自带的ProgressBa
  • 嵌入式系统学习(七)-bootloader修改实例

    从 github 中下载 Nanopi2 的 uboot 源码后 从源代码根目录中找到 u boot lds 文件 可以看到以下内容 以上片断可以分析出 整个 uboot 程序从 arch arm cpu slsiap s5p4418 st