U-BOOT程序的运行机制

SPL详解:U-Boot启动内存调试指南 摘要: SPL(次级程序加载器)是现代嵌入式系统启动的关键组件,用于解决主U-Boot过大无法直接在芯片小容量SRAM中运行的矛盾。作为精简版U-Boot,SPL负责初始化DRAM等核心硬件,将主U-Boot加载至DRAM后移交控制权。其特点包括:极简代码(仅含硬件初始化基础功能)、无交互、独立编译为u-boot-spl.bin。调试时需区分SPL阶段(依赖JTAG/串口打印)和主U-Boot阶段(使用内存操作命令),重点排查DRAM初始化问题。对于更小SRAM的系统,可能还需TPL作为第三阶段加载器。SP 阅读详情
u-boot的最新版本代码是1.1.6,可以到 http://sourceforge.net/projects/u-boot下载。
u-boot中已经对ATMEL官方的评估板at91rm9200dk 进行了支持,可参考u-boot源代码中的board/at91rm9200dk目录下的代码进行修改,以适合你自己的at91rm9200开发板。国内通常所谓的u-boot移植也就是这样,对 u-boot完全不支持的一款评估板进行移植,还是有一些工作量的。uboot主要的移植工作量就在和硬件打交道的那层,就是board目录下的文件。首先要读懂参考板的代码, 比较你自己的开发板的外设和ATMEL官方的评估板at91rm9200dk(参考板)有哪些不同,以期望以最小的改动完成移植。

 

虽然u-boot支持很多种评估系统,但是它们的工作流程还是有很多的共通点,这归功于u-boot的设计者缜密的结构设计。
下面,我以前在工作中做的ppc的移植为例,讲一下u-boot大致的执行顺序:

1. start.S

System Reset codes
L2 cache init

2. 计算绝对地址 (r3), jump in_flash

board_asm_init: board_asm_init.S

3. setup_bats: start.S

4. 开启PowerPC 的 MMU (data & instruction)

enable_addr_trans: start.S

5. 开启 L1 data cache, setup stack pointer

l1dcache_enable: cache.S

6. (PowerPC 的 assembly macros 文件中)

GET_GOT: ppc_asm.tmpl

7. PowerPC 前期初始化, 传递 bootflag

cpu_init_f: cpu_init.c

8. board 前期初始化

board_init_f: lib_ppc/board.c
- 提供 (serial) console
- 初始化 RAM
- 重建 stack
- relocate_code: start.S: in_ram

9. board 后期初始化

board_init_r: lib_ppc/board.c

10. 进入 U-Boot command loop

进入 main_loop(): main.c

针对ARM S3C2410 (对AT91RM9200也是一样的,因为它也是ARM920T的Core),那么u-boot程序的入口在cpu/arm920t的start.S,不论针对哪个体系结构,u-boot总是从cpu目录下相应的体系结构目录下的start.S这个汇编文件开始的。这个文件中下面这句:
ldr pc, _start_armboot
_start_armboot: .word start_armboot
表示u-boot程序已经完成了前面那段汇编(CPU的初始化),将跳转到C程序中间了。start_armboot就是一个C函数,也是汇编跳转到C,执行的第一个C函数。start_armboot位于lib_arm/board.c,完成ARM评估板所有的设备初始化,然后进入到main_loop函数循环,其实我们要移植的部分就集中在start_armboot中所涉及到的各个设备初始化函数,例如board_init、serial_init、console_init_f、console_init_r 、flash_init ()等等,这些函数和你的评估板相关的。

init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
dram_init, /* configure available RAM banks */
display_dram_config,
#if defined(CONFIG_VCMA9)
checkboard,
#endif
NULL,
};

void start_armboot (void)
{
DECLARE_GLOBAL_DATA_PTR;

ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD)
unsigned long addr;
#endif

/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));

monitor_flash_len = _bss_start - _armboot_start;

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}

/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);

#ifdef CONFIG_VFD
# ifndef PAGE_SIZE
# define PAGE_SIZE 4096
# endif
/*
* reserve memory for VFD display (always full pages)
*/
/* armboot_end is defined in the board-specific linker script */
addr = (_bss_start + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
size = vfd_setmem (addr);
gd->fb_base = addr;
#endif /* CONFIG_VFD */

/* armboot_start is defined in the board-specific linker script */
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);

#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND:");
nand_init(); /* go init the NAND */
#endif

#ifdef CONFIG_HAS_DATAFLASH
AT91F_DataflashInit();
dataflash_print_info();
#endif

/* initialize environment */
env_relocate ();

#ifdef CONFIG_VFD
/* must do this after the framebuffer is allocated */
drv_vfd_init();
#endif /* CONFIG_VFD */

/* IP Address */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");

/* MAC Address */
{
int i;
ulong reg;
char *s, *e;
uchar tmp[64];

i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? 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;
}
}

devices_init (); /* get the devices list going. */

jumptable_init ();

console_init_r (); /* fully init console as a device */

#if defined(CONFIG_MISC_INIT_R)
/* miscellaneous platform dependent initialisations */
misc_init_r ();
#endif

/* enable exceptions */
enable_interrupts ();

/* Perform network card initialisation if necessary */
#ifdef CONFIG_DRIVER_CS8900
cs8900_get_enetaddr (gd->bd->bi_enetaddr);
#endif

#ifdef CONFIG_DRIVER_LAN91C96
if (getenv ("ethaddr")) {
smc_set_mac_addr(gd->bd->bi_enetaddr);
}
/* eth_hw_init(); */
#endif /* CONFIG_DRIVER_LAN91C96 */

/* Initialize from environment */
if ((s = getenv ("loadaddr")) != NULL) {
load_addr = simple_strtoul (s, NULL, 16);
}
#if (CONFIG_COMMANDS & CFG_CMD_NET)
if ((s = getenv ("bootfile")) != NULL) {
copy_filename (BootFile, s, sizeof (BootFile));
}
#endif /* CFG_CMD_NET */

#ifdef BOARD_LATE_INIT
board_late_init ();
#endif

/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
}

/* NOTREACHED - no way out of command loop except booting */
}


 
ARM《4》_在开发板上裸机编程实现GPIO编程控制LED灯闪烁 波特率(Baud Rate)是串口通信中衡量数据传输速度的关键参数,表示单位时间内传输的 “码元” 数量(通常单位是 “波特”,1 波特 = 1 码元 / 秒)。在串口通信中,它决定了发送方和接收方 “同步传输数据的节奏”,只有双方设置相同的波特率,才能正确解析彼此发送的信息。 阅读详情

相关推荐

uboot的作用和功能

uboot是用来干什么的,有什么作用? uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核 所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。 uboot是怎样引导启动内核的? uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,

sixtome 705

uboot详解(嵌入式学习)

bootmgr 根据配置信息,选择并加载操作系统的启动文件(例如,Windows 的 NTLDR 或 Windows Boot Loader),然后将控制权交给相应的启动文件,最终启动 Windows 操作系统。需要注意的是,U-Boot 和 Windows Boot Manager 是两个不同的引导加载程序,用于不同的系统环境。U-Boot 是主要用于嵌入式系统的开源引导加载程序,它通常在嵌入式系统中使用,负责初始化硬件设备、加载操作系统内核和启动应用程序。开发者可以根据具体的硬件平台进行配置。

2743

嵌入式Linux高级编程:深入解析编译、链接与运行机制

优化程序性能:通过分析符号表和重定位信息,减少冗余代码。解决系统级问题:如动态库版本冲突、内存地址错误等。定制化需求:编写链接脚本控制代码布局,适配特殊硬件。

嵌入式技术开发 535

uboot初探

总结:     1   uboot其实就是个大程序,大的裸机程序     2   uboot 和Linux内核不一样,他没有多任务调度运行的机制,不能实现任务调度等操作系统应用功能,虽然可以挂接文件系统,也可以有网络协议栈     3   uboot最初执行的是汇编,集中在那三个汇编文件当中,然后就是C代码了 uboot起初是为powerpc开发的启动程序,uboot是个bootloade...

淮南草的博客 4985

C语言嵌入式Linux高级编程:程序的编译、链接与运行深度解析

理解程序的编译、链接与运行机制是嵌入式开发的核心基础。从预处理到动态链接,每一步都涉及底层细节的精确控制。通过工具链(如GCC、Binutils)和脚本(如链接脚本),开发者可以灵活适配不同硬件平台,优化程序性能与资源占用。深入掌握这些知识,能够有效解决系统级问题,提升嵌入式软件的开发效率。

嵌入式技术开发 460

Spring Boot运行机制源码剖析

Spring Boot运行机制源码剖析 1 SpringBoot入口程序 1.SpringApplication运行的代码如下: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 2.自定义SpringApplication 1).通过Spr

weixin_40055163的博客 258

MPC8349E-mITXE的U-Boot汇编start.S分析笔记(转)

1 /*    2 * // MPC8349E-mITX ltib U-Boot cpu/mpc83xx/start.S --- by starby    3 *    4 * Copyright (C) 1998 Dan Malek    5 * Copyright (C) 1999 Magnus Damm    6 * Copyright (C) 2000, 2001,2002

liningustb123的专栏 2903

如何使用Ray和PyTorch训练模型

用户编写训练函数 → 定义单机训练逻辑。通过扩缩容配置 → 指定需要多少资源(Worker 数量、CPU/GPU)。训练器整合训练函数和配置 → 自动将训练函数分发到多个 Worker 上并行执行。Worker 运行训练函数 → 在分布式环境中完成模型训练。通过这种模式,Ray Train 实现了对分布式训练的抽象,用户只需关注单机训练逻辑,无需手动管理分布式通信和资源分配。

m0_62464865的博客 1922

u-boot 详细介绍

Bootloader对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作Bootloader。6.1.1  Bootloader介绍Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。对

menuconfig的专栏 4428

保姆级教程:从OrthoFinder到CAFE5,手把手搞定基因家族收缩扩张分析(附完整代码与避坑指南)

本文提供从OrthoFinder到CAFE5的基因家族收缩扩张分析全流程教程,涵盖数据预处理、系统发育树准备、CAFE5运行与参数优化等关键步骤。通过详细代码示例和避坑指南,帮助研究者高效完成基因家族进化分析,特别适合生物信息学初学者。

dianshu1593的博客 391

Cadence Virtuoso ADE L保姆级教程:从DC到Noise,一次搞定6种仿真设置

本文提供Cadence Virtuoso ADE L的全面仿真教程,涵盖DC工作点分析、瞬态响应、AC特性、零极点分布和噪声性能等6种仿真设置。通过详细的步骤和实用技巧,帮助工程师高效完成从基础配置到高级后处理的完整工作流,显著提升IC设计效率。

weixin_26841743的博客 600

RISC-VUBOOT程序运行架构分析:深入解析U_BOOT在RISC-V架构下的运行机制

RISC-VUBOOT程序运行架构分析:深入解析U_BOOT在RISC-V架构下的运行机制 去发现同类优质开源项目:https://gitcode.com/ 随着信息技术和嵌入式领域的快速发展,RISC-V架构作为一种开源的指令集架构,逐渐受到业界的广泛关注。今天,我们就来介绍一个开源项目——RISC-V UBOOT程序运行架构分析,该项目为广大开发者和研究人员提供了一个深入理解RISC-V架构下...

gitblog_06758的博客 982

UE5 Niagara基础知识讲解

在UE5版本中,Niagara粒子系统引入了许多可添加的模块,分别用于控制发射器的生成和更新、粒子的生成和更新以及渲染效果。本文采用虚幻5.2.1版本,以图文方式对Niagara基础知识进行讲解。

一碗清深的博客 2470

u-boot分析 四 (程序入口start.S)

u-boot分析 四 (程序入口start.S) 注:部分内容摘抄自网络,如有问题,请联络博主。 本文内容:了解以stars.S为开始的ARM汇编程序部分。 回顾前几篇博文,咱们见识过了u-boot的目录结构,另外简要分析了u-boot.lds脚本文件的link原理。而今天我们要来听听嵌入式程序君告诉咱们的第一句“话”。 正式开始之前,我们需要准备三样东西: u-...

heart18335101121的博客 848

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1952

浅谈u-boot

uboot是个大软件 uboot是个最大的裸机程序,但是uboot没有多任务运行的机制,不能实现任务调度等操作系统应用的功能,虽然有协议栈,有文件系统,但是没有多任务运行的内核 uboot是研究裸机最好的范例,这个是本质区别 uboot包含了非常丰富的功能,而且是源代码全开放 最初是为powerpc开发的启动程序 内核启动以后,uboot就没什么事了,完成任务靠边站了 uboot是个bootloa...

qq_44715649的博客 600

解锁RK3588 HDMI输出:分辨率与EDID的深度探索

本文详细探讨了瑞芯微RK3588处理器的HDMI输出分辨率配置与EDID解析技术。文章首先介绍了RK3588处理器的性能特点及其HDMI功能在多媒体和工业领域的应用价值,随后分别阐述了HDMI输出分辨率的硬件连接要求和软件配置方法,包括4K/8K等不同分辨率的配置实例。在EDID部分,深入解析了EDID的数据结构、交互机制,以及数据获取与修改的具体方法。最后总结了配置过程中常见问题的解决方案,并展望了RK3588在高分辨率显示领域的发展前景。全文为开发者提供了RK3588 HDMI显示配置的完整技术指南。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 592

uboot的介绍

1.1.uboot从哪里来的  (1)uboot是SourceForge上的开源项目。  (2)uboot项目最早是由一个德国人发起的。  (3)uboot就是由一个人发起,然后由整个网络上所有感兴趣的人所有感兴趣的人共同维护发展而来的一个bootloader。 1.2.uboot的发展历程  (1)自己使用的小开源项目。  (2)被更多人认可使用。  (3)被SoC厂商默认支持

x_jjt的博客 885

uniapp+coze制作app智能体

使用 UniApp 配合 Coze 平台来开发一个具备 AI 智能体的 App,是一个高效且实用的选择。其核心思路主要有两种:一种是通过,另一种则是通过实现更自主的集成。下面的流程图可以帮你快速了解这两种方案的全貌。下面,我们来详细看看这两种方案分别如何操作。

suny8的专栏 573

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Bootloader

Bootloader是在操作系统内核或用户应用程序运行之前的一段小程序,用来初始化硬件设备、建立内存空间的映射图,从而将系统环境带到一个合适的状态,以便为最终调用准备好环境。Bootloader不属于操作系统内核,采用汇编语言编写,因此针对不同的CPU体系结构,这一部分代码不具有可移植性。在移植操作系统时,这部分代码必须加以改写,Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统

Think 1418

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

笔记

u-boot———————————————————————————————— 1。解压缩 2.打补丁 patch -p(n) 3.配置 make 100ask14x0_config 4.编译 make 编译之后用oflash 烧写 u-boot 的功能 1. 硬件相关的初始化 关看门狗 初始化时钟 初始化sdram 烧写flash 网卡 usb 串口 从flash中读出内核 启动内核

急需成长的路 400

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Uboot和系统移植(11)------- uboot的硬件驱动部分

目录一,uboot与linux驱动二,简单分析iNand/SD驱动1.iNand/SD驱动解析12.iNand/SD驱动解析2三、驱动框架思想 一,uboot与linux驱动 1、uboot本身是裸机程序 (1)裸机本来是没有驱动的概念的(狭义的驱动的概念就是操作系统中用来具体操控硬件的那部分代码叫驱动) (2)裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个有什么区别?本质区...

big_C的博客 504

PYNQ原理(20190111)

文章目录1 常用指令2 pynq+led demo复现报错 PYNQ runs on Linux which uses the following Zynq PS peripherals by default: SD Card to boot the system and host the Linux file system, Ethernet to connect to Jupyter note...

tiaozhanzhe1900的博客 697

鸿蒙系统中断常规启动,鸿蒙系统的启动流程,建议收藏!

声明:严格来说本文档并非真正原创的,这是上了朱有鹏老师的免费课《想读懂鸿蒙 2.0 源码,也许你需要先懂这些》之后,做的一些总结。课程时间一个半小时,内容也很多,学习过程中我发现朱老师的 PPT 上部分代码/文件,在我本地的鸿蒙系统代码上找不到,或者路径不相同,所以我就做了一些整理。这里仅摘取课程中的鸿蒙系统在 HI3516DV300 平台上的启动流程部分(从 30:00 开始讲解启动过程)进行汇...

weixin_33249310的博客 1668

u-boot之NAND启动与NOR启动的区别

u-boot之NAND启动与NOR启动的区别 nand启动与nor启动的区别主要分为以下几部分说明: 1、nand flash与nor flash的最主要区别 2、s3c2440的nand启动与nor启动原理 3、nand启动与nor启动的时候uboot做了什么   1、在JZ2440开发板上有两种Flash,分别为nand flash和nor flash。这两种flash的最主要的区别为:nor flash比较稳定,存在里面的数据不易丢失,但是容量小,nor flash在读的时候可以像内存一.

qq_41882586的博客 2651
上一篇: strcmp()的源码
下一篇: u-boot 简介
menuconfig
博客等级 码龄19年 713粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值