工程分析 - u-boot
一 环境搭建
- 编译环境
- 编译方法
二 启动流程
1. u-boot 启动到 main_loop
u-boot 启动流程
启动流程特别说明:crt0.S:_main
参考1 + 参考2启动流程特别说明:init_sequence_f
参考1 + 参考2启动流程特别说明:gd 的意义、用途
启动流程特别说明:init_sequence_r
启动流程特别说明:u-boot relocate 技术
2. u-boot-spl 启动到 u-boot
为什么需要SPL?
SPL 技术在产品设计中是可选的,当sram的存储不足以容纳u-boot的时候推荐使用。
思考问题:sram 较小的情况下,为什么不直接使用dram呢:bootrom直接把 u-boot加载到dram不就可以了吗?这样多好,中间环节spl就省略了。
笔者看来,问题可能出在bootrom 不支持dram的最优初始化参数,甚至不清楚如何初始化dram。这部分工作只能交给u-boot-spl、u-boot来做。SPL 和非SPL U-boot 在执行流程上的差异
一个支持SPL技术的平台:DM814*
3.1 dm184x 应用了SPL技术(TI 把二进制spl文件命名为MLO)export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- make ti814x_evm_defconfig make "CFLAGS+= -g OPTFLAGS= -Os" -j4| tee log
3.2 MLO 和 u-boot.img 在二进制大小的差异
ospin@ospin-VirtualBox:~/code/ti814x_boot$ ls -l MLO -rw-rw-r-- 1 ospin ospin 49436 2月 5 16:06 MLO ospin@ospin-VirtualBox:~/code/ti814x_boot$ ls -l u-boot.img -rw-rw-r-- 1 ospin ospin 390840 2月 5 16:06 u-boot.img
u-boot-spl 和 u-boot 在职能和源码组成上的差异?
4.1 MLO 和 u-boot 在二进制文件的差异
3. u-boot 加载内核以及ramdisk
内核:一般内核镜像的格式分类
适配:u-boot支持的内核格式
ramdisk:ramdisk制作方法
u-boot 如何引导内核
4.1 引导Legacy Imagebootm, bootz, booti 这几个都是从内存中的某个地址获得kernel image。 bootz是启动zImage,而bootm和booti是启动uImage,其中booti专门用来启动ARM64的kernel image。 它们的基本语法是:bootX <kernel address> <rootdisk address> <fdt(dts file) address>,这里的address都是指内存的物理地址,需要提前把image和file加载到内存中,其中根文件系统的地址可以省略(包含在kernel image中),用-来代替。在常规的启动引导过程中,uboot的各种启动方式实际上最后都是调用bootz的,但之前会设置很多环境变量作为启动的参数。在调试过程中,我们也同样可以手动设置好参数,直接用bootX系列来启动系统。
4.2 引导FIT Image
bootm
3. U-boot SPL 功能分析
SPL 和 非SPL U-boot 在二进制文件上的差异
3.4 SPL(对于TI:MLO),是可以编译dtb的,命名为:u-boot-spl.dtb,它怎么得到的呢?
/tools/fdtgrep -b u-boot,dm-pre-reloc -b u-boot,dm-spl -RT arch/arm/dts/origin-dtb-name.dtb -n /chosen -n /config -O dtb | ./tools/fdtgrep -r -O dtb - -o dts/dt-spl.dtb
可见u-boot-spl.dtb 是从origin-dtb-name.dtb 通过fdtgrep 过滤得到:
spl设备树只取带有{u-boot,dm-pre-reloc/u-boot,dm-spl 标记|| /chosen//config Node} 的节点,并且最终spl-dtb文件中的u-boot,dm-pre-reloc/u-boot,dm-spl 属性被去掉了。3.5
三 功能分析
1. 源码特点:平台抽象
u-boot 依赖Kconfig 完成特定代码的编译工作,依赖链接脚本完成代码链接工作。
链接好的代码又存在一层抽象,即:arm common level 代码形成模板调用接口,接口具体由cpu/board level代码实现。
Arm-Soc 平台代码:mach-xx
ospin@ospin-VirtualBox:~/code/u-boot-2018.11$ ls arch/arm/ config.mk Kconfig mach-at91 mach-exynos mach-k3 mach-mvebu mach-qemu mach-snapdragon mach-stm32mp mach-versal Makefile cpu Kconfig.debug mach-bcm283x mach-highbank mach-keystone mach-omap2 mach-rmobile mach-socfpga mach-sunxi mach-versatile thumb1 dts lib mach-bcmstb mach-imx mach-kirkwood mach-orion5x mach-rockchip mach-sti mach-tegra mach-zynq include mach-aspeed mach-davinci mach-integrator mach-meson mach-owl mach-s5pc1xx mach-stm32 mach-uniphier mach-zynqmp-r5
Cpu-Core 平台代码
arm产品系列 + 特别说明 cpu core 架构源码列表如下:ospin@ospin-VirtualBox:~/code/u-boot-2018.11$ ls arch/arm/cpu/ arm11 arm1136 arm1176 arm720t arm920t arm926ejs arm946es armv7 armv7m armv8 built-in.o Makefile pxa sa1100 u-boot.lds u-boot-spl.lds
#禁止FIQ, IRQ中断,重设异常向量表,进入svc Mode /home/ospin/code/u-boot-2018.11/arch/arm/cpu/armv7/start.S
Board 平台代码
lowlevel_init 存储在板级代码里/*_start 阶段板级平台代码*/ /home/ospin/code/u-boot-2018.11/board/armltd/vexpress/vexpress_common.c
CONFIG_SYS_INIT_SP_ADDR /*_start 阶段gd 的地址*/
Arm-common代码
4.1 Arm 中断向量表模板/home/ospin/code/u-boot-2018.11/arch/arm/lib/vectors.S #中断向量_start 存储在平台代码里 /home/ospin/code/u-boot-2018.11/arch/arm/cpu/armv7/start.S
4.2 Arm 初始化模板
/home/ospin/code/u-boot-2018.11/arch/arm/lib/crt0.S /* #arm 初始化模板 sram alloc board_init_f relocate_code relocate_vectors init relocated bss board_init_r */
All-arch common 模板
/*初始化通用模板*/ /home/ospin/code/u-boot-2018.11/common/board_f.c
2. DM 技术
- 参考博客
DM 技术是对driver 的上层封装/抽象。 比如serial-uclass 或者gpio-uclass, 用户可以选择支持他们,也可以不支持。 - 优点:
通过DM 技术, 用户可以把全部的平台设备和驱动程序bind 到 uclass 结构中,进行统一管理。
3. device_probe
- device_probe 设计的初衷:
笔者认为主要是完成硬件层面的配置。当然也可以用来完成driver 数据结构的组织工作。 - device_probe 什么时候调用?
上层通过uclass层准备获取设备的时候,可能调用下面两个函数。最终调用了uclass_get_device_tail 并在这个函数里完成device_probe.
意义:用户在准备使用设备时才probe!int uclass_get_device_by_name(enum uclass_id id, const char *name,struct udevice **devp) int uclass_get_device(enum uclass_id id, int index, struct udevice **devp)
4. 板级配置:.config 和 config.h
4.1 .config
- .config 借助Kconfig 语法生成,参考link
- .config 的意义
.config 决定了哪些源码文件被编译,以及源码文件中哪些预处理代码并编译。就好像从u-boot 的整体集合中选中了一个子集,支持自己的板子。 - .config 文件的输出
3.1 编译过程中,.config 文件中的key=val pair 被转换为C风格的头文件,然后存储在 include/generated/autoconf.h
3.2 u-boot.cfg 文件记录了 .config 和 conifg.h 的最终结果!!!
4.2 config.h
- conifg.h 文件用于板子所用到的参数,比如地址信息等,例如:
./include/config.h includes ./include/configs/vexpress_ca9x4.h
2. env 加载和存储
env 存储整体设计
参考大图
3. serial 设备驱动、接口
参见大图
5. u-boot-spl 引导 u-boot
5. U-boot 二进制输出命名规则
- u-boot.img vs u-boot.bin
- 其它
6. U-boot设备树功能分析
- U-boot 源码和设备树 编译过程
- U-boot 设备树的设计思想
- U-boot 设备树格式与解析
7. U-boot 增加一个命令
https://blog.csdn.net/zd845101500/article/details/104017849
8. U-boot 启动内核 bootcmd
- booti/bootz/bootm
- bootcmd
9. 内存布局和检测
9.1 内存分类
SRAM 是 SOC 片内存储, 容量非常小。 在 init_sequence_f 阶段用于存储 struct global_data 结构体
SDRAM 是SOC 片外存储, 容量和体积大。 在init_sequence_f 阶段调用 dram_init 实现检测。
dram_init 函数由board level 代码实现,通过读写内存完成存储单元功能检测。
9.2 内存布局
gd->ram_base = CONFIG_SYS_SDRAM_BASE; //内存基地址
gd->ram_top = gd->ram_base + get_effective_memsize(); //内存顶部地址
... reserve memorys...
gd->relocaddr = gd->ram_top - reserveed mem - ;
gd->relocaddr -= gd->mon_len; //uboot 重放地址gd->start_addr_sp = gd->relocaddr;
gd->start_addr_sp -= TOTAL_MALLOC_LEN;//malloc 内存分配gd->start_addr_sp -= sizeof(bd_t);
gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t)); //board info 内存分配gd->start_addr_sp -= sizeof(gd_t);
gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t)); //新的gd_t 在sdram的分配gd->start_addr_sp -= gd->fdt_size;// fdt 内存分配
gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size); debug("New Stack Pointer is: %08lx\n", gd->start_addr_sp); //最后得到栈顶
11. struct global_data
参考博客
四 工程设计
1.
五 工具的使用
qemu 也能支持gdb调试
1.1 qemu 启动gdbserver
1.2 arm-linux-gdb 安装方法
1.3 u-boot 符号表支持gdb#qemu $qemu-system-arm -M vexpress-a9 -s -S -kernel u-boot#gdb $arm-linux-gnueabi-gdb $(gdb) target remote localhost:1234 $(gdb) bt
qemu 学习资料
vexpress a9 学习资料
3.1 qemu 对 vexpress的介绍:mothter board + daughter card
3.2 Versatile Express 的一篇wiki
3.3 qemu退出方法反汇编dtb
https://blog.csdn.net/xiezhi123456/article/details/82416165
工程分析 - u-boot相关推荐
- MATLAB数学计算与工程分析范例教程,MATLAB数学计算与工程分析范例教程
基本信息 书名:MATLAB数学计算与工程分析范例教程 定价:28.00元 作者:石博强,赵金 编著 出版社:中国铁道出版社 出版日期:2005-05-01 ISBN:9787#113057596 字 ...
- ML之FE:利用FE特征工程(分析两两数值型特征之间的相关性)对AllstateClaimsSeverity(Kaggle2016竞赛)数据集实现索赔成本值的回归预测
ML之FE:利用FE特征工程(分析两两数值型特征之间的相关性)对AllstateClaimsSeverity(Kaggle2016竞赛)数据集实现索赔成本值的回归预测 目录 输出结果 设计思路 核心代 ...
- 机器学习cae_CAE工程分析技术年会记
读书使人充实,讨论使人机智,笔记使人准确,读史使人明智,读诗使人灵秀,数学使人周密,科学使人深刻,伦理使人庄重,逻辑修辞使人善辩.凡有所学,皆成性格.---- (英国)培根 可能是会议热度不够,非常遗 ...
- 03-instancing 工程分析详解
opengl编程指南第8版源码怎么下载.编译,请参考<opengl编程指南第8版源码编译详细说明> 1. 程序启动 请参考<03-drawcommands工程分析详解> 2. ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- python与金融工程的区别_科研进阶 | 纽约大学 | 金融工程、量化金融、商业分析:Python金融工程分析...
科研进阶 | 纽约大学 | 金融工程.量化金融.商业分析:Python金融工程分析(2021.2.6开课)mp.weixin.qq.com 课题名称 = Python金融工程分析 = 项目配景 大数 ...
- MATLAB数学计算与工程分析范例教程,MATLAB 2016数学计算与工程分析从入门到精通...
全书通过近400个实例讲解了利用MATLAB 2016进行数学计算和工程分析的方法和技巧,涵盖了MATLAB的五大功能:1)数值计算功能:2)符号计算功能:3)图形与数据可视化功能:4)可视化建模与仿 ...
- 计算机辅助工程分析课程论文,教学大纲—计算机辅助工程分析.doc
<计算机辅助工程分析>课程教学大纲 英文课程名Computer Aided Engineering总 学 时32学 分2课程编码202725理论教学学时8适用专业机械工程.过程装备与控制工 ...
- FPGA设计心得(5)Aurora 例子工程分析与仿真实例分析(streaming版)
文章目录 背景 例子工程预览 例子程序用户模块逻辑分析 收(CHECK) 发(GEN) 例子程序仿真文件分析 写在最后 工程分享 参考资料 交个朋友 背景 熬夜写完了上两篇博客: Aurora IP ...
- 全志H3 uboot传参到内核分析,boot.scr文件分析
传参过程 uboot倒计时结束,默认以bootcmd来启动内核,它等于 fatload mmc 0:1 ${scriptaddr} boot.scr; source ${scriptaddr} 上面两 ...
最新文章
- Win2008 R2 RemoteApp深度体验之四,RemoteApp程序测试
- Android存储数据到本地文件
- Singleton模式的实现
- atmega8 例程:PWM
- string类的实现(构造函数,析构函数,运算符重载)
- Mysqldump命令参数介绍
- 等差数列末项计算(信息学奥赛一本通-T1035)
- neo4j docker
- java类包装器有什么用_Java中的包装器类
- 采用new分配内存失败时为什么会出现两种错误报告方式?
- 汽车企业售后业务数字化转型,究竟有多卷
- apqp过程流程图范本_过程流程图(APQP要求)
- linux运行python乱码_linux下python中文乱码解决方案
- 必须指定计算机名称,指定网络名不再可用处理方法,指定网络
- 1237 -- 地盘划分
- 对文件进行哈夫曼编码压缩与译码的C++实现 以及压缩率计算 ——HIT杨朔
- uniapp跨域设置
- 一个人到过的12个国家,45座城市
- 动态规划最好的讲解之一 | 算法干货
- SAP 零售 FMS 物料主数据(一)
热门文章
- NSAT-9000电池模组充放电自动测试系统
- 传输速率和可用带宽(吞吐量)计算
- 农产品区块链溯源平台建设解决方案,健全食品安全体系
- “旧改之王”佳兆业,理不清债务难题
- 零基础学习FFMPEG
- 在 Picorv32 / 蜂鸟 E203 软核上运行 RT-Thread
- 分析国内CRM系统全新排行
- 【服务器】无公网IP,异地远程连接威联通NAS
- python安装失败找不到指定路径_使用[WinError 2]安装python-crfsuite失败系统找不到指定的文件...
- appendTo的应用