UBOOT 图文分析

本文详细介绍了U-Boot的编译流程,包括如何通过.map和链接文件辅助分析。在启动流程部分,讲解了bootcmd指令的作用,内核加载和设备树配置。同时,阐述了配置参数,如ENV_IS_EMBEDDED对环境变量的影响,bootcmd和bootargs的设定。此外,还讨论了Bootparameters分区的功能和内核启动后根文件系统的挂载。
摘要由CSDN通过智能技术生成

       为了方便分析uboot源代码 我们需要先编译 再分析 这样可以降低分析难度 不然很多同名函数都不知道用的哪一个。编译完成后最终要的两个辅助分析文件.map文件以及链接文件,通过map文件我们可以知道那个文件被编译,通过链接文件我们可以获得中体的一个情况。

5 编译流程如下(linux uboot 以及 buildroot基本上都类似 先加载默认配置 然后再配置 最后编译)

make xxx_deconfig 

make menuconfig

make 

4 imx6ull uboot启动流程

 (1) bootcmd启动指令的作用是,读取linux内核到0x30007FC0的位置,读取设备树到0x32000000的位置,最后执行bootm 0x30007FC0 - 0x32000000指令,该指令最终会调用该do_bootm_linux()函数,该函数随着uboot的版本差异会发生变化,该函数一般配置标记列表或者配置设备树相关信息,最后调用kernel_entry(0, machid, r2)启动linux内核
(2) 由于一开始只能移一部分uboot代码,所以在代码重定位之前所有的全局变量都不能用,在c函数运行之前必须指定堆栈指针,此时的堆栈指针位于内部RAM。重定位之后,需要使用绝对跳转指令(ldr pc )跳转到SDRAM中。

3 在嵌入系统的固态存储设备上有相应的分区来存储它们,如图所示为一个典型的分区结构。

“Bootparameters”分区中放一些可设置的参数,比如IP地址、串口波特率、要传递给内核的命令行参数等。正常启动过程中,Bootloader首先运行,然后它将内核复制到内存中 (也有些内核可以在固态存储设备上直接运行),并且在内存某个固定的地址设置好要传递给内核的参数,最后后运行内核。内核启动之后,它会挂接(mount)根文件系统(“Root filesystem”),启动文件系统中的应用程序。

2 配置参数

(1)ENV_IS_EMBEDDED定义:这种情况的环境变量在flash上存着(但是占了flash一个扇区),并且随着代码段(因为环境变量区嵌在代码段内)在start.s重定位时一同载入内存。在环境变量初始化时候,如果这部分能通过校验,就不需要先在堆区开辟空间然后搬移的工作,而是直接使用这部分环境变量(省了搬移工作)。倘若不能通过校验,则使用默认环境变量放到重定位时环境变量所占的空间中。

ENV_IS_EMBEDDED未定义:env_init()函数使用默认的环境变量。env_relocate()函数:先malloc一段内存,后将环境变量从nand/eeprom/nor指定位置读到申请的内存中。

env_init()函数的作用是校验环境变量是否有效,无效使用默认环境变量,有效使用保存的环境变量。

env_relocate()函数:先malloc一段内存,后将环境变量从nand/eeprom/nor指定位置读到申请的内存中。(如果内嵌环境变量校验成功,就不在需要malloc内存了)

#define CFG_ENV_IS_IN_NAND        1      //声明环境变量存储在nandflash中 #define CFG_ENV_OFFSET            0x40000 //环境变量偏移地址 #define CFG_ENV_SIZE64            0xc000   // Total Size of Environment Sector 

(2) bootcmd :自动启动时默认执行的一些命令

#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x32000000 kernel; bootm 0x32000000" 将nand flash中的kernel复制到0x32000000,然后执行bootm 0x32000000启动内核

(3) bootargs:启动参数

root //用来指定rootfs(根文件系统)的位置 rootfstype //根文件系统类型(若根文件系统是ext2,此选项可省略,其他类型的根文件系统需要此选项) console //控制终端 initrd,noinitrd//当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。 init//内核启起来后,进入系统中运行的第一个进程,一般init=/linuxrc mem//内存大小

#define CONFIG_BOOTARGS  "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" //根文件系统位于/dev/mtdblock2 //在文件系统挂载后,运行的第一个程序就是根目录下的linuxrc //控制台为ttySAC0。

目录 u-boot-1.1.6 之 cpu/arm920t/start.s分析 ........................................................................................... 2 u-boot 中.lds连接脚本文件的分析 ...................................................................................................12 分享一篇我总结的 uboot 学习笔记(转) .....................................................................................15 U-BOOT内存布局及启动过程浅析 ...................................................................................................22 u-boot 中的命令实现 .......................................................................................................................... 25 U-BOOT环境变量实现 ........................................................................................................................28 1.相关文件 ....................................................................................................................................28 2.数据结构 ....................................................................................................................................28 3.ENV 的初始化...........................................................................................................................30 3.1env_init ............................................................................................................................30 3.2 env_relocate ...................................................................................................................30 3.3*env_relocate_spec ........................................................................................................31 4. ENV 的保存 ..............................................................................................................................31 U-Boot 环境变量 ..........................................................................................................................32 u-boot 代码链接的问题 ......................................................................................................................35 ldr 和 adr 在使用标号表达式作为操作数的区别 ............................................................................40 start_armboot 浅析 ..............................................................................................................................42 1.全局数据结构的初始化 ..........................................................................................................42 2.调用通用初始化函数...............................................................................................................43 3.初始化具体设备 .......................................................................................................................44 4.初始化环境变量 .......................................................................................................................44 5.进入主循环 ...............................................................................................................................44 u-boot 编译过程 ...................................................................................................................................44 mkconfig文件的分析 .......................................................................................................................... 47 从 NAND闪存中启动 U-BOOT的设计 ..............................................................................................50 引言 ...............................................................................................................................................50 NAND闪存工作原理 ................................................................................................................... 51 从 NAND闪存启动 U-BOOT的设计思路.................................................................................. 51 具体设计 ....................................................................................................................................... 51 支持 NAND闪存的启动程序设计 ..................................................................................... 51 支持 U-BOOT命令设计 ...................................................................................................... 52 结语 ............................................................................................................................................... 53 参考文献 ....................................................................................................................................... 53 U-boot 给 kernel 传参数和 kernel 读取参数—struct tag (以及补充) ............................................ 53 1 、u-boot 给 kernel 传 RAM 参数 ........................................................................................54 2 、Kernel 读取 U-boot 传递的相关参数 .............................................................................56 3 、关于 U-boot 中的 bd 和 gd...............................................................................................59 U-BOOT源码分析及移植 ....................................................................................................................60 一、 u-boot 工程的总体结构: ..................................................................................................61 1、源代码组织 ....................................................................................................................61 2.makefile简要分析 ............................................................................................................61 3、u-boot 的通用目录是怎么做到与平台无关的?......................................................63 4、smkd2410 其余重要的文件 : ...................................................................................63 二、u-boot 的流程、主要的数据结构、内存分配 ................................................................64 1、u-boot 的启动流程: ...................................................................................................64 2、u-boot 主要的数据结构 ...............................................................................................66 3、u-boot 重定位后的内存分布: ...................................................................................68 三、u-boot 的重要细节 。 ........................................................................................................68 关于 U-boot 中命令相关的编程 : ................................................................................. 73 四、U-boot 在 ST2410 的移植,基于 NOR FLASH和 NAND FLASH启动。......................... 76 1、从 smdk2410 到 ST2410: .............................................................................................. 76 2、移植过程: .................................................................................................................... 76 3、移植要考虑的问题: ...................................................................................................77 4、SST39VF1601: .................................................................................................................77 5、我实现的 flash.c主要部分: ...................................................................................... 78 6、增加从 Nand 启动的代码 : ..................................................................................... 82 7、添加网络命令。 ............................................................................................................ 87
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值