超详细【Uboot驱动开发】(二)uboot启动流程分析
本文将深入解析Uboot(BL2阶段)的启动流程,BL1阶段的源码详细流程会在后续文章中分享。首先,详细我们来看Uboot的分析执行流程,以EMMC作为启动介质为例。命码RPG 游戏源码 Uboot启动流程大致如下:首先打开u-boot.lds文件,令源它是源码Uboot工程的关键链接脚本,指定入口地址ENTRY(_start)。详细通过查找u-boot.lds文件(通常在源码目录下),分析可以理解程序的命码组装过程。 进入程序执行,令源board_init_f()函数在common/board_f.c中,源码负责调用init_sequence_f进行初始化,详细包括串口、分析定时器、设备树和DM驱动模型等,还包括global_data结构体初始化。其中,reloc_xxx函数实现重定向功能,将Uboot镜像移到高端内存以避免内存冲突。 重定向的必要性和过程包括:当内存不足时,Uboot会将自身镜像移动到DDR的其他位置。具体步骤包括在arch/arm/lib/crt0.S文件内的处理。setup_reloc函数帮助我们跟踪重定向后的地址,便于调试。 后续,board_init_r负责后置初始化,如外设信息的对战游戏源码初始化。最后,执行run_main_loop和main_loop函数,main_loop是Uboot的核心,处理kernel加载、命令行交互和预定义命令等任务。 在main_loop中,bootdelay_process负责启动倒计时,cli_loop则负责命令行交互。通过理解这些关键步骤,我们对Uboot的启动流程有了全面认识。深入了解部分则可根据个人兴趣逐步探索。 如果有疑问或需要进一步讨论,欢迎在评论区交流。参考文章链接如下:[0]:优化阅读体验
[1]:board_init_f的详细介绍
[2]:启动流程参考
[3]:main_loop的相关内容
linuxuboot
ubootæ¯ä»ä¹ææï¼U-Bootï¼å ¨ç§°UniversalBootLoaderï¼æ¯éµå¾ªGPLæ¡æ¬¾çå¼æ¾æºç 项ç®ãU-Bootçä½ç¨æ¯ç³»ç»å¼å¯¼ãU-Bootä»FADSROMã8xxROMãPPCBOOTéæ¥åå±æ¼åèæ¥ãå ¶æºç ç®å½ãç¼è¯å½¢å¼ä¸Linuxå æ ¸å¾ç¸ä¼¼ï¼äºå®ä¸ï¼ä¸å°U-Bootæºç å°±æ¯æ ¹æ®ç¸åºçLinuxå æ ¸æºç¨åºè¿è¡ç®åèå½¢æçï¼å°¤å ¶æ¯ä¸äºè®¾å¤ç驱å¨ç¨åºï¼è¿ä»U-Bootæºç ç注éä¸è½ä½ç°è¿ä¸ç¹ã
ubootæ¯ä¸ä¸ªæä½ç³»ç»å æ ¸è¿æ¯ä¸æ®µå¼å¯¼ç¨åºï¼
æ¯ä¸æ®µå¼å¯¼ç¨åºã
1ï¼ubootæ¯ç¨æ¥å¹²ä»ä¹çï¼æä»ä¹ä½ç¨ï¼
ubootå±äºbootloaderçä¸ç§ï¼æ¯ç¨æ¥å¼å¯¼å¯å¨å æ ¸çï¼å®çæç»ç®çå°±æ¯ï¼ä»flashä¸è¯»åºå æ ¸ï¼æ¾å°å åä¸ï¼å¯å¨å æ ¸
æ以ï¼ç±ä¸é¢æè¿°çï¼å°±ç¥éï¼UBOOTéè¦å ·æ读åflashçè½åã
2ï¼ubootæ¯ææ ·å¼å¯¼å¯å¨å æ ¸çï¼
ubootåå¼å§è¢«æ¾å°flashä¸ï¼æ¿åä¸çµåï¼ä¼èªå¨æå ¶ä¸çä¸é¨å代ç æ·å°å åä¸æ§è¡ï¼è¿é¨å代ç è´è´£æå©ä½çuboot代ç æ·å°å åä¸ï¼ç¶åuboot代ç åækernelé¨å代ç ä¹æ·å°å åä¸ï¼å¹¶ä¸å¯å¨ï¼å æ ¸å¯å¨åï¼æçæ ¹æ件系ç»ï¼æ§è¡åºç¨ç¨åºã
3ï¼ubootå¯å¨ç大è¿ç¨æ¯æä¹æ ·çï¼
ubootå¯å¨ä¸»è¦å为两个é¶æ®µï¼ä¸»è¦å¨start.sæ件ä¸ï¼ç¬¬ä¸é¶æ®µä¸»è¦åçæ¯ç¡¬ä»¶çåå§åï¼å æ¬ï¼è®¾ç½®å¤çå¨æ¨¡å¼ä¸ºSVC模å¼ï¼å ³éçé¨çï¼å±è½ä¸æï¼åå§åsdramï¼è®¾ç½®æ ï¼è®¾ç½®æ¶éï¼ä»flashæ·è´ä»£ç å°å åï¼æ¸ é¤bss段çï¼bss段æ¯ç¨æ¥åå¨éæåéï¼å ¨å±åéçï¼ç¶åç¨åºè·³è½¬å°start_arm_bootå½æ°ï¼å®£å第ä¸é¶æ®µçç»æã
第äºé¶æ®µæ¯è¾å¤æï¼åçå·¥ä½ä¸»è¦æ¯1.ä»flashä¸è¯»åºå æ ¸ã2.å¯å¨å æ ¸ãstart_arm_bootç主è¦æµç¨ä¸ºï¼è®¾ç½®æºå¨idï¼åå§åflashï¼ç¶åè¿å ¥main_loopï¼çå¾ ubootå½ä»¤ï¼ubootè¦å¯å¨å æ ¸ï¼ä¸»è¦ç»è¿ä¸¤ä¸ªå½æ°ï¼ç¬¬ä¸ä¸ªæ¯s=getenv(bootcmdï¼ï¼ç¬¬äºä¸ªæ¯run_command(s...),æ以è¦å¯å¨å æ ¸ï¼éè¦æ ¹æ®bootcmdç¯å¢åéçå 容å¯å¨ï¼bootcmdç¯å¢åéä¸è¬æ示äºä»æ个flashå°å读åå æ ¸å°å¯å¨çå åå°åï¼ç¶åå¯å¨ï¼bootmã
ubootå¯å¨çå æ ¸ä¸ºuImage,è¿ç§æ ¼å¼çå æ ¸æ¯ç±ä¸¤é¨åç»æï¼çæ£çå æ ¸åå æ ¸å¤´é¨ç»æï¼å¤´é¨ä¸å æ¬å æ ¸ä¸çä¸äºä¿¡æ¯ï¼æ¯å¦å æ ¸çå è½½å°åï¼å ¥å£å°åã
ubootå¨æ¥åå°å¯å¨å½ä»¤åï¼è¦åç主è¦æ¯ï¼1ï¼è¯»åå æ ¸å¤´é¨ï¼2ï¼ç§»å¨å æ ¸å°åéçå è½½å°åï¼3ï¼å¯å¨å æ ¸ï¼æ§è¡do_bootm_linux
do_bootm_linux主è¦åç为ï¼1ï¼è®¾ç½®å¯å¨åæ°ï¼å¨ç¹å®çå°åï¼ä¿åå¯å¨åæ°ï¼å½æ°åå«ä¸ºsetup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tagï¼æ ¹æ®ååæ们就ç¥éå ·ä½ç段å åå¨çä¿¡æ¯ï¼memoryä¸ä¸ºæ¿åçå å大å°ä¿¡æ¯ï¼commandline为å½ä»¤è¡ä¿¡æ¯ï¼
2ï¼è·³å°å ¥å£å°åï¼å¯å¨å æ ¸
å¯å¨çå½æ°ä¸ºthe_kernel(0,bd->bi_arch_number,bd->bi_boot_param)
bd->bi_arch_number为æ¿åçæºå¨ç ï¼bd->bi_boot_param为å¯å¨åæ°çå°å
æ»ç»ï¼
1)uboot主è¦ä½ç¨æ¯ç¨æ¥å¯å¨æä½ç³»ç»å æ ¸ãä½ç°å¨ubootæåä¸å¥ä»£ç å°±æ¯å¯å¨å æ ¸ã
2)ubootè¿è¦è´è´£é¨ç½²æ´ä¸ªè®¡ç®æºç³»ç»ãä½ç°å¨ubootæåçä¼ åã
3)ubootä¸è¿ææä½Flashçæ¿åä¸ç¡¬ä»¶ç驱å¨ãä¾å¦ä¸²å£è¦æå°ï¼pingç½ç»æåï¼æ¦é¤ãç§åflashæ¯å¦æåçã
4)ubootè¿å¾æä¾ä¸ä¸ªå½ä»¤è¡çé¢ä¾äººæ¥æä½ãå¾ç®åï¼è³å°ä½ è½çå°ã
ubootå½ä»¤å¦ä½å¼å¯¼linuxï¼
U-Booté¤äºBootloaderçç³»ç»å¼å¯¼åè½,å®è¿æç¨æ·å½ä»¤æ¥å£,å ·å¤å¤ç§å¼å¯¼å æ ¸å¯å¨çæ¹å¼ã常ç¨çgoåbootmå½ä»¤å¯ä»¥ç´æ¥å¼å¯¼Linuxå æ ¸æ åå¯å¨ãU-Bootï¼å ¨ç§°UniversalBootLoaderï¼æ¯éµå¾ªGPLæ¡æ¬¾çå¼æ¾æºç 项ç®ãä»FADSROMã8xxROMãPPCBOOTéæ¥åå±æ¼åèæ¥ãå ¶æºç ç®å½ãç¼è¯å½¢å¼ä¸Linuxå æ ¸å¾ç¸ä¼¼ï¼äºå®ä¸ï¼ä¸å°U-Bootæºç å°±æ¯æ ¹æ®ç¸åºçLinuxå æ ¸æºç¨åºè¿è¡ç®åèå½¢æçï¼å°¤å ¶æ¯ä¸äºè®¾å¤ç驱å¨ç¨åºï¼è¿ä»U-Bootæºç ç注éä¸è½ä½ç°è¿ä¸ç¹ã
å¦ä½ghostlinuxç³»ç»ï¼
使ç¨Ghost软件æ¥å®ç°å¤ä»½åæ¢å¤Linuxç³»ç»ï¼
1ãé¦å ç¨âé¨ææ¨é£GhostXPSP3纯åçY6.0âå çè¿è¡å¼å¯¼ï¼å¹¶ä½¿ç¨å ¶ä¸çPQ软件对硬çè¿è¡ååºï¼åååºä¸ä¸ªååºç¨äºå®è£ DOSç³»ç»ãç¶åéæ©ï¼âè¿è¡YLMFDOSå·¥å ·ç®±âãå³ï¼è¿è¡PQ软件ï¼å¯¹ç¡¬çè¿è¡ååºã
2ãå åä¸ä¸ªååºï¼å¤§å°ä¸ºå¤§çº¦ä¸º4Gï¼ç¨äºå®è£ DOSç³»ç»ä»¥ååæ¾GHOSTæåçå¤ä»½æ件ï¼å½ç¶å®é å½ä¸ï¼åºè¯¥å°è¿ä¸ªååºç大å°è°å¤§ç¹ã
3ãåæ¶è¿éææ°ååºåºæ¥çCçï¼è®¾ç½®ä¸ºâæ´»å¨âï¼ä»¥æ¹ä¾¿å¯å¨æ¶ï¼è½ä»Cçå¯å¨DOSç³»ç»ã
4ãç¨å çè¿è¡å¼å¯¼ï¼å建Cçå¯å¨DOSç³»ç»æ¶æéè¦çæ件ï¼ä»¥åGHOSTç¨åºçå¤å¶å°Cçã
5ãå®è£ Linuxç³»ç»ï¼å¨å®è£ æ¶ï¼å»ºè®®ä¸è¦æGRUBå®è£ MBRä¸ï¼åæ¶å¨ååååºæ¶ï¼å»ºè®®ä¸ºï¼bootãvarãhomeå建åç¬çååºã
6ãä»DOSç³»ç»å¯å¨ï¼ç¶åè¿è¡GHOST软件对Linuxç³»ç»è¿è¡å¤ä»½ã1ï¼ãå¤ä»½Linuxç³»ç»çbootååºï¼â/boot"ï¼ã2ï¼ãå¤ä»½Linuxç³»ç»çæ ¹ååºï¼"/"ï¼7ãLinuxç³»ç»åºç°é®é¢ï¼æ æ³å¯å¨æ³¨æï¼ç±äºä¹åæDOSç³»ç»çååºï¼å³ï¼Cçï¼ï¼è®¾ç½®æâæ´»å¨âï¼æ以è¿éå¿ é¡»ä¿®æ¹ä¸ä¸ï¼è®©â/boot"设置ææ´»å¨çï¼è¿æ ·æè½å¯å¨linuxç³»ç»ã
Uboot编译与打包流程
设备:firefly RKQ SDK: Firefly提供的SDK uboot源码
前言:本文将带领大家获取RKQ源码,了解u-boot源码编译方法、uboot镜像生成与说明,提供对uboot编译镜像的整体认识。
源码获取:访问Firefly官网下载iCore Q SDK源码,参考wiki文档解压同步RK Android SDK源码。
uboot编译:进入u-boot目录,执行命令进行整体编译。出现成功日志表示编译完成。
uboot镜像说明:uboot编译后生成目标文件,重点介绍两个重要镜像及其生成方式。
loader镜像生成:调用fit.sh脚本中的指令实现,依赖DDR、USB、miniloader相关bin文件,h网站源码合并输出生成。
uboot.itb镜像生成:先生成uboot.itb镜像,再由mkimage工具根据u-boot.its文件形成,大小固定为4MB。
uboot.img镜像生成:fit.sh脚本调用命令,ITB_MAX_NUM与ITB_MAX_KB参数固定在2与,确保大小稳定。
make.sh脚本分析:make.sh主要执行步骤包括参数分析、工具链与平台配置、芯片信息获取、镜像大小与配置文件选择、额外参数处理与镜像打包等。
总结:本篇介绍了uboot镜像生成与make.sh脚本执行流程,了解各镜像来源与make.sh功能,有助于后续代码修改。
系统启动uboot启动流程源码分析
本文旨在解析uboot启动流程中的核心部分,即BL2阶段及主函数main_loop的工作原理。uboot启动分为BL1和BL2两个阶段,BL1阶段主要进行硬件初始化,而BL2阶段则负责对外部设备初始化以及uboot命令集的实现。
BL1阶段通常在start.s文件中,用汇编语言编写,完成硬件基础配置。随后,BL2阶段启动,主函数start_armboot位于lib_arm/board.c中。此阶段主要功能包括:调用init_sequence中的函数序列,实现设备初始化和uboot命令的微赚源码实现。
重点分析了start_armboot函数,它通过遍历调用init_sequence数组中的函数,执行关键初始化步骤。一旦检测到执行错误,程序将挂起并提示用户重新启动。接着,main_loop()引导启动Linux内核,这是uboot启动流程的核心。
main_loop()函数负责设置启动参数、启动内核等关键步骤,实现uboot的最终目标。它执行一系列与具体平台无关的任务,如初始化启动次数限制、设置软件版本、打印启动信息及解析命令等。
在解析main_loop()函数时,关键在于理解其如何管理和执行上述任务。函数通过一系列逻辑判断和调用子函数实现这些目标。例如,判断是否使用预设的bootdelay值来控制启动延迟。若满足条件,则执行相关代码来处理用户输入和输出信息,最终实现uboot与Linux内核的顺利过渡。
为了更全面理解main_loop()的工作机制,本文提供了一个简化版的函数实现,去除了宏定义控制的部分代码,以便更直观地展示其核心逻辑和流程。通过深入分析这些代码,微星源码读者可以更深入地理解uboot启动流程的复杂性与细致性。
总结uboot的重要概念,不知道的看过来
本篇内容不讲解uboot源码,只总结面试中高频问到的重要知识点。内容适用于嵌入式新人了解uboot,对老手有复习和查漏补缺的作用。
1、PC机启动:上电后,BIOS程序初始化DDR内存和硬盘,从硬盘读取OS镜像到DDR,跳转执行OS。
2、嵌入式Linux系统启动:上电后执行uboot,初始化DDR、Flash,将OS从Flash读到DDR,启动OS。
3、uboot定义与作用:uboot属于bootloader,作为单线程裸机程序,主要作用是初始化硬件、内存、flash等,引导内核启动。
4、uboot启动阶段(不同平台差异):MTK平台:boot rom -> preloader -> lk -> kernel;RK平台:bootrom -> spl(miniloader) -> uboot -> trust -> kernel;NXP平台:bootrom -> bl2 -> ATF -> uboot -> kernel。
5、uboot支持多种启动方式:SPI Flash/eMMC/Nvme/SD/Hard Disk/U-Disk/net。启动方式不同,固件存放位置也不同。
6、掌握uboot的关键点:命令和环境变量。uboot启动后大部分工作在shell中完成,命令用于操作,环境变量如bootcmd和bootargs,用于设置启动参数。
7、bootargs参数详解:root用于指定rootfs位置,console用于设置控制台,mem用于指定内核使用内存大小,ramdisk_size用于设置ramdisk大小,initrd用于指定initrd参数,init用于指定启动脚本,mtdparts用于设置分区。
8、常用bootargs组合:文件系统为ramdisk、jffs2类型、nfs等不同情况下的bootargs设置示例。
总结,了解uboot是嵌入式开发的基础,掌握其启动过程和关键参数,对提高开发效率和解决问题有重要作用。
uboot是什么
Uboot是一种开源的嵌入式系统引导加载程序。 Uboot(Universal Boot Loader)是一种主要用在嵌入式系统中的开源引导加载程序。它在系统启动时加载并初始化硬件设备,然后加载操作系统的内核或根文件系统到内存中,为操作系统的运行做好准备。以下是关于Uboot的详细解释: Uboot的主要功能: 1. 启动加载:Uboot能够识别并加载不同类型的存储介质上的内核映像和根文件系统映像,并将其传输到嵌入式设备的RAM中,为系统的正常启动打下基础。 2. 硬件初始化:在启动过程中,Uboot会进行必要的硬件初始化工作,包括内存、网络等设备的初始化配置。 3. 环境参数配置:Uboot提供了环境变量的设置和读取功能,允许用户配置系统的启动参数、网络参数等。这些配置信息存储在特定的存储介质上,方便系统重启后恢复配置。 4. 设备驱动支持:Uboot支持多种嵌入式设备的驱动,包括网卡、串口等,确保系统的硬件功能能够得到充分发挥。 Uboot的特点: 开源性:Uboot是开源的,源代码公开,开发者可以根据需要进行定制和修改。 可移植性:Uboot能够支持多种处理器架构和嵌入式操作系统,具有良好的可移植性。 稳定性:由于Uboot在嵌入式系统中扮演着重要的角色,其稳定性和可靠性至关重要。经过多年的发展和改进,Uboot已经变得越来越成熟和稳定。 广泛应用:Uboot在嵌入式领域有着广泛的应用,如路由器、机顶盒、工业控制设备等,是许多嵌入式系统不可或缺的一部分。 总之,Uboot在嵌入式系统中扮演着非常重要的角色,它是连接硬件和操作系统的桥梁,负责系统的引导和初始化工作。其开源性、可移植性和稳定性使得它在嵌入式领域得到了广泛的应用。嵌入式Linux之uboot源码make配置编译正向分析(一)
嵌入式Linux系统由以下几部分组成:在Flash存储器中,它们的分布一般如下。Bootloader是操作系统运行之前执行的一段小程序,用于初始化硬件设备、建立内存空间映射表,为操作系统内核做准备。Bootloader依赖于CPU体系结构和嵌入式系统板级设备配置。u-boot支持多种架构,适用于上百种开发板。设计与实现包括工程简介、源码结构、编译过程、源码加载等。u-boot源码可以从ftp.denx.de/pub/u-boot/网站下载,DENX网站提供更多信息,u-boot git仓库位于gitlab.denx.de/u-boot/u...。u-boot编译分为配置和编译两步,需要指定交叉工具链、处理器架构。配置过程可以生成.config文件。源码加载使用Source Insight,安装、打开项目、共享文件夹、映射网络驱动器等步骤。
Linux学习 - 编译Uboot
在Linux学习中,编译Uboot是一项重要的技术任务。首先,选择合适的平台,比如Ubuntu ..5 LTS版本,可以使用野火提供的虚拟机镜像,或者自行下载官方镜像进行搭建。
安装编译工具和依赖使用APT工具可以快速完成,为后续的编译工作奠定基础。随后,获取uboot下载源代码,野火提供的链接包括Gitee和GitHub,选择合适的下载途径。
查看并切换uboot分支,通常仓库中维护着不同版本的uboot,使用命令如"git checkout ebf_v__imx"进行切换。若需下载特定分支的uboot,可通过命令指定。
编译Uboot分为NAND版本和EMMC版本,以EMMC版本为例,首先需要修改defconfig配置文件,将"mx6ull_fire_mmc_defconfig"改为"mx6ull_fire_nand_defconfig"。编译完成后的u-boot-dtb.imx文件即为目标文件。
在编译过程中,可能会遇到问题,如编译错误或文件命名冲突。此时,参考相关解决方案,例如知乎上的文章,可以有效解决问题。正点原子出厂的u-boot编译步骤包括下载源代码、修改相关文件、加载配置、编译并确认环境变量正确设置等。
编译完成后,确保bootargs值中包含正确的参数,例如"rootwait",否则可能导致启动错误。正确的bootargs参数格式为"bootargs=root=/dev/mmcblk1p2 rwrootwait rootfstype=ext4 console=ttymxc0,"。
以上步骤构成了完整的Uboot编译过程,通过实践与不断学习,可以深入掌握Linux下的Uboot编译技巧。
2024-11-30 13:23
2024-11-30 12:55
2024-11-30 12:33
2024-11-30 12:23
2024-11-30 12:13