uboot的介绍

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
1.1 uboot的介绍

Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。

1.2 uboot的体系结构

目录树

|--board
|--common
|--cpu
|--disk
|--doc
|--drivers
|--dtt
|--examples
|--fs
|--include
|--lib_arm
|--lib_generic
|--net
|--post
|--rtc
|--tools

1. board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,比如说: leopard2a子目录中存放与我们开发板相关的配置文件.
2. common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c。
3. cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm926ejs就是我们开发板上使用的cpu架构目录。
4. disk:对磁盘的支持。
5. doc:文档目录。Uboot有非常完善的文档,推荐大家参考阅读。
6. drivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。
7. fs: 支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。
8. include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开 发板相关的配置头文件,如leopard2a.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.
9. lib_xxxx: 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。
10. net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
11. tools:生成Uboot

的工具,如:mkimage, crc等等。

2、uboot的运行过程分析

2.1 启动模式介绍

大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

启 动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。

下载(Downloading)模 式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 BootLoader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。

UBoot这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。

2.2 运行过程

大 多数bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,uboot也不例外。依赖于CPU体系结构的代码(如CPU初 始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

U - Boot 编译后的代码定义一般不超过100kB ,并且这100 kB 又分成两个阶段来执行. 第一阶段的代码在start . s 中定义,大小不超过10 kB ,它包括从系统上电后在0x00000000 地址开始执行的部分. 这部分代码运行在Flash 中,它包括对arm926ejs的一些寄存器的初始化和将U - Boot 的第二阶段代码从Flash 拷贝到SDRAM 中. 除去第一阶段的代码,剩下的部分都是第二阶段的代码. 第二阶段的起始地址是在第一阶段代码中指定的,被复制到SDRAM后,就从第一阶段跳到这个入口地址开始执行剩余部分代码. 第二阶段主要是进行一些BSS 段设置,堆栈的初始化等工作,最后会跳转到main -loop 函数中,接受命令并进行命令处理. 图1 给出了U - Boot 的详细的运行过程包括对内核的设置、装载及调用过程。
  • 系统复位进入u-boot stage l的入口点
  • 硬件设备的初始化
  • 为加载uboot stage 2准备ram空间
  • 设置好堆栈
  • 跳转到stage 2的C入口点
  • 初始化本阶段要用到的设备
  • 检查内存映射
  • 将kernel映像和文件映像从flash中读到ram中
  • 为内核设定启动参数
  • 调用内核
     
2.3 本开发板的地址分布(leopard2a)

本目标板是RAM 16M, Flash 8M,具体空间如图所示:

1F12FFFF
Uboot
Uboot_env
Kernel
Rootfs
1F000000
1F020000
1F01FFFF
1F02FFFF
1F030000
1F130000
1F7EFFFF
Kernel
Rootfs
FLASH
SDRAM
0x00030000
0x00130000
0x00430000

可以根据变换后的分区结构,设置
uboot_addr,uboot_addr_end,kernel_addr,kernel_addr_end,rootfs_addr,rootfs_addr_end,
config_addr, config_addr_end等环境变量,调整bootloader。

SDRAM的调整修改linux-2.4.20_mvl31/drivers/mtd/maps/physmap.c

2.4 运行代码分析

2.4.1 stage 1

uboot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码包括定义入口,设置异常向量,设置cpu的模式和频率,配置内存区控制寄存器,安装uboot的栈空间,关闭看门狗等。由于本人对ram的汇编不太熟悉,所以这一部分不作具体分析。

2.4.2 stage 2

lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个uboot(armboot)的主函数,该函数主要完成如下操作:

2.4.2.1 调用一系列初始化函数

1. 指定初始函数表:
init_fnc_t *init_sequence[] = {
cpu_init, /* cpu的基本设置 */
board_init, /* 开发板的基本初始化 */
interrupt_init, /* 初始化中断 */
env_init, /* 初始化环境变量 */
init_baudrate, /* 初始化波特率 */
serial_init, /* 串口通讯初始化 */
console_init_f, /* 控制台初始化第一阶段 */
display_banner, /* 通知代码已经运行到该处 */
dram_init, /* 配制可用的内存区 */
display_dram_config,
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
checkboard,
#endif
NULL,
};

执行初始化函数的代码如下:
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
       if ((*init_fnc_ptr)() != 0) {
         hang ();
       }
}

2. 配置可用的Flash区
flash_init ()

3. 初始化内存分配函数
mem_malloc_init()

4. nand flash初始化
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND:");
nand_init();        /* go init the NAND */
#endif

5. 初始化环境变量
env_relocate ();

6. 外围设备初始化
devices_init()

7. I2C总线初始化
i2c_init();

8. LCD初始化
drv_lcd_init();

9. VIDEO初始化
drv_video_init();

10. 键盘初始化
drv_keyboard_init();

11. 系统初始化
drv_system_init();

2.4.2.2 初始化网络设备

初始化相关网络设备,填写IP、MAC地址等。

1. 设置IP地址
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

2. 设置mac地址
{
       int i;
       ulong reg;
       char *s, *e;
       uchar tmp[64];

       i = getenv_r ((uchar*)("ethaddr"), tmp, sizeof (tmp));
       s = (i > 0) ? (char*)tmp : NULL;

       for (reg = 0; reg < 6; ++reg) {
         gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
         if (s)
            s = (*e) ? e + 1 : e;
       }
}

2.4.2.3 进入主UBOOT 命令行

进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
for (;;) {
       main_loop ();
}}

3、uboot的移植和测试

3.1 移植的过程

① 在宿主机上建立交叉编译开发环境
② 修改cpu/arm926ejst目录中的文件内容,
主要包含cpu.C,start.S,interrupts.C以及seria1.C,speed.C等文件
③ 在board目录下创建自己的目标板(开发板)目录leopard2a
在目录下创建leopard2a.C,flash.C,memsetup.S
以及Makefile,u-bot.1ds,config.mk文件
④ 在include/configs目录下创建leopard2a.h
⑤ 打开u-bot目录下Makefile文件,加入如下两行:
leopard2a_config :    unconfig
@./mkconfig $(@:_config=) arm arm926ejs leopard2a
⑥ 编译。运行命令:
1. make leopard2a_config
2. make
编译成功.生成基本的u—b00t.
⑦ 烧写.把编译成的u-bot.bin
至此移植u-bot过程结束.

3.2 移植主要修改的文件

移植u—boot到开发板上只需要修改和硬件相关的代码即可。这首先就联想到cpu目录下的启动代码,另外参考u—boot/readme文件可知其他还需要修改的主要文件有:

Makefile文件,和include目录下的目标板.h头文件(leopard2a.h),board目录下的目标板.C文件(leopard2a.c),flash.C文件,u-boot.1ds链接文件,以及cpu目录下的串口驱动文件。

具体修改如下:
① cpu/arm926ejst目录下
  • start.S启动代码。
② board/leopard2a
  • leopard2a.C文件。这个文件主要是SDRAM 的驱动程序,主要完成SDRAM 的UPM 表设置,上电初始化。暂时不改。
  • flash.C文件。Flash的驱动程序就在此文件中。
  • memsetup.S文件。
  • config.mk文件.此文件用于设置程序链接的起始地址。
  • u-boot.Ids文件。
③ include/configs目录下leopard2a.h文件.此文件是leopard2a目标板头文件,大多数寄存器参数是在这一文件中设置完成的.

3.3 uboot网络下载功能的添加和RAM调试

在commom/main.c 中的main_loop函数中添加tftp下载的函数,可以通过按钮触发下载rimage,kimage。
在烧录u-boot.bin之前,需要进行ram调试,保证uboot可以在EVB上正常运行。
先下載U-boot 到SDRAM上, 然後執行SDRAM 上的U-boot 程序, 以確認U-boot可以正常執行, Command 如下:
1. “tftp a00000 u-boot.bin” <= 下載程序到SDRAM
2. “go a00000” <= 從SDRAM 執行程序

如果U-boot 可以相容於目前的硬件, 5VT EVB 會重新正常啟動,要是不能正常啟動,表示U-boot 不相容於目前的硬件, 請更換新的u-boot。再重新測試, 直到被測試的U-boot可以正常啟動!

http://blog.chinaunix.net/u1/56374/showart_510411.html
Uboot开发与移植笔记(超详细代码讲解)(一) 本文对UBoot源码进行详细讲解,逐一带你从0修改UBoot源码进行移植工作 阅读详情

相关推荐

[uboot] (番外篇)uboot relocation介绍

uboot relocation

ooonebook的博客 1万+

u-boot详解

Uboot获取: 首先就是uboot官网。缺点就是支持少,比如某一款具体芯片驱动等完善。uboot官网下载地址 SOC厂商会从uboot官网下载某一个版本的uboot,然后在这个版本的uboot上加入相应的SOC以及驱动。这就是SOC厂商定制版的uboot。NXP官方的I.MX6ULL EVK板子, 做开发板的厂商,开发板会参考SOC厂商的板子。开发板必然会和官方的板子一样。因此开发板厂商又会去修改SOC厂商做好的uboot,以适应自己的板子。 ......

chengcao123的博客 1万+

飞腾uboot命令介绍

本文介绍了飞腾uboot使用的一些主要命令。包括nvme、sata、网络等命令。

乌拉大喵喵 848

全网最全面最易懂的U-Boot解读

看了上面的源码目录结构,知你是否发现,它跟内核的目录结构有一定的相似,仔细想想就难明白,其实u-boot就是一个嵌入式系统,他跟那些大的,复杂的系统本质上并没有区别,都是可以让一个平台正常的工作,有驱动,文件系统,网络子系统,post,也有运行其上的应用程序等等,只是他只支持单进程,能提供像linux中的复杂调度机制,虽然也有上面那些子系统,但是整个结构很简单,只能实现最基本的功能。总体而言,U-Boot和Linux都是复杂的开源项目,它们的开发难度取决于开发者的经验、背景知识和所涉及的具体任务。

robin__su的博客 2万+

uboot介绍介绍uboot的基本概念、用法和实现方式

uboot介绍

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1万+

Uboot

uboot

举子人间 7681

[uboot] (番外篇)uboot之fdt介绍

介绍uboot中的device tree的配置以及使用。简单流程介绍等等

ooonebook的博客 2万+

Uboot介绍Uboot目录结构介绍

Uboot介绍Uboot目录结构介绍

2301_76587520的博客 327

三、uboot简单介绍

操作系统的启动,首先我们要知道,操作系统在开发板上电之后是存在存储器里面的EMMC/SD卡,而操作系统是跑在内存中的,这时我们需要一个东西,将我们的操作系统搬运到内存中,这个东西就是boot loader,它又叫做系统的引导程序。

qq_46069770的博客 1295

Linux uboot功能介绍

本篇文章我们来讲解uboot的功能,uboot无论是在单片机还是在Linux中都是有非常重要的地位的,那么本篇文章就带大家来学习什么是ubootuboot的功能。U-Boot(Universal Bootloader)是一个开源的引导加载程序和嵌入式系统的第一个可执行程序。它被广泛应用于嵌入式系统和嵌入式Linux设备,用于启动操作系统和进行硬件初始化。1.跨平台支持:U-Boot是一个高度可移植的引导加载程序,它可以在多种处理器架构上运行,如ARM、x86、PowerPC、MIPS等。

m0_49476241的博客 1085

bootloader的简单介绍以及uboot

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题,二维码如下: 本文是根据韦东山视频教程整理的课程笔记!! 一 什么是bootloader 嵌入式芯片有很多启动方式,有支持内部flash启动,外部nand flash启动,外部nor flash启动,...

myselfzhangji的博客 1388

ubootuboot编译实践和内部目录介绍

                                               编译实践            一、关于uboot的源码编译生成uboot.bin     1、我用的是朱有鹏老师的课程所以我有官方已经移植好的uboot源码所以我只是讲一下        uboot编译的过程和结果。(这是源码解压包的名称    qt_x210v3_130807.tar.bz2)    ...

雨于鱼的博客 1005

Uboot介绍Uboot

Uboot介绍Uboot

2301_76587520的博客 433

Bootloader介绍Uboot源码结构

本文是对《嵌入式Linux应用开发完全手册》的一个自我总结! 一. Bootloader介绍 1.Bootload引入的原因 Bootloader的作用是在系统启动的时候初始化必要的硬件设备,引导内核镜像文件,传递参数给内核,然后将控制权交给内核以结束自己的使命。总的来说就是为了引导操作系统。 Bootloader非常依赖具体的硬件,对每一个板子都有一个独一无二的Bootloa

u010919352的博客 7170

uboot移植之IOMUX介绍

uboot移植之IOMUX介绍

2301_76587520的博客 391

UBOOT介绍

U-boot全称 Universal Boot Loader,是遵循GPL条款的开放项目,uboot 是一个裸机代码,可以看作是一个裸机综合例程,执行启动内核的功能。补充:GPL条款(GNU General Public License,GNU通用公共许可证)是一种自由软件许可证,而GNU代表“GNU's Not Unix”,是开源的操作系统项目,大多数GNU系统使用开源的Linux内核,GPL条款保证了开源内核的自由性,使用GPL条款后,

qq_47258284的博客 5624

run命令 uboot_常用uboot命令介绍

Printenv 打印环境变量。Uboot> printenvbaudrate=115200ipaddr=192.168.1.1ethaddr=12:34:56:78:9A:BCserverip=192.168.1.5Environment size: 80/8188 bytesSetenv 设置新的变量Uboot> setenv myboard AT91RM9200DKUboot&g...

weixin_39568597的博客 222

Uboot命令行介绍

最新的uboot命令行已经发展得比较完善,很大程度上接近shell,包含了各种基本的驱动和完整的工具。这些工具的源码大多在u-boot/cmd下,查看Makefile可以看到,根据同的配置编译出很多命令,你也可以通过搜索字符串来查找这些命令的命名。这些命令的列表可以通过命令行输入help来查看,大致分成几个大类。

1263

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 770
上一篇: Fedora安装vmware-tools后系统无法正常启动的解决方法
下一篇: linux下的mv命令使用详解
小艾的01
博客等级 码龄14年 121粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值