uboot启动流程图以及boot启动linux流程图

运行厂商u-boot的前提:

运行u-boot,需要DDR或者DRAM,串口,SD卡驱动、EMMC、NAND,这些要和厂商的开发板一致,就能直接在自己板子上运行u-boot

开机流程:
当把u-boot.bin下载到SD卡上时,由于整个u-boot的起始地址为87800000,所以开始从SD卡启动IMX6ULL时,arm内核从sd卡中取指令,在DDR的87800000上运行u-boot,接着就是整个u-boot的启动流程,再通过bootcmd来自动从emmc中拷贝zImage和dtb根文件到指定地址的DDR中运行linux,bootz启动linux(其中分为从emmc启动linux,还是从网络tftp上启动linux),其中通过bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2, 来将参数告诉linux,让linux知道从imx6ull从ttymxc0串口与linux进行交互,并且设置115200波特率,且根文件系统要保存在/dev/mmcblk1p2(也就是emmc的第二个分区)。由于下载的zImage是压缩包,linux想要运行就必须先进行自解压缩,这就需要linux的第一行代码为kernel_entry(),它就是将linux进行解压的函数,在uboot的启动最后阶段会按照kernel_entry()的要求给其传入三个参数,在启动前做如下操作:

①、关闭 MMU。
②、关闭 D-cache。
③、 I-Cache 无所谓。
④、 r0=0。
⑤、 r1=machine nr(也就是机器 ID)。
⑥、 r2=atags 或者设备树(dtb)首地址。

一旦进入kernel_entry()函数,u-boot的使命结束,linux开始工作。

linux启动所做的工作:

1、确保CPU处于SVC模式且关闭所有中断,检查是否支持该CPU,验证设备树是否存在,使能MMU,调用 start_kernel 来启动 Linux 内核。(linux内核的第一阶段,接下来进入C语言)

2、未完待续。。。。

u-boot移植流程:(几个移植的重要文件)

mx6ull_14x14_evk_emmc_defconfig(添加开发板默认配置文件

uboot的configs 目录下有很多配置文件,可想而知,每一个配置文件就对应一块开发板。
我们找到 mx6ull_14x14_evk_emmc_defconfig, 这是nxp官方的配置文件,我们就是参考它做修改。

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_my_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_MY_EMMC=y
CONFIG_CMD_GPIO=y

mx6ullevk.h(添加自己开发板的头文件)

在include/configs 下拷贝mx6ullevk.h 并修改。

在这个头文件中有许多宏定义,这些宏基本用于配置uboot,也有一些I.MX6ULL 的配置项目。
如果我们想要禁用uboot的某些功能,在这个头文件中修改即可。

mx6ullevk.h 文件中基本都是“CONFIG_”开头的宏定义,这也说明 mx6ull_alientek_emmc.h 文件的主要功能就是配置或者裁剪 uboot如果需要某个功能的话就在里面添加这个功能对应的 CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。(在具体u-boot的启动流程中,会有ifdefine CONFIG_XXX ,则运行下面的代码,如果你没有定义或者删除改宏定义,则下面的代码就不会运行,相当与对u-boot进行了裁剪)

mx6ullevk.h 中包含了 mx6_common.h,如果没有在mx6ullevk.h中发现某个功能或命令,但uboot中又确实存在,可以去mx6_common.h 中寻找。


mx6ull_alientek_emmc(添加开发板对应的板级文件夹)

uboot中每一块板子都拥有一个板级文件夹,用来存放板级文件。比如开发板上的外设驱动文件等。

NXP 的 I.MX 系列芯片的所有板级文件夹都存放在 board/freescale 目录下,imx6ull 对应的板级文件夹是mx6ullevk。同样备份重命名。

进 入 mx6ull_alientek_emmc 目 录 中 , 将 其 中 的 mx6ullevk.c 文 件 重 命 名 为mx6ull_alientek_emmc.c

1、修改板级文件夹目录下的 Makefile 文件

将文件名修改为刚刚改的文件,这样才会编译mx6ull_my_emmc.c这个文件。

2、修改 imximage.cfg 文件

PLUGIN 这一项路径改成我们自己文件夹的路径。

3、修改 Kconfig 文件

4、修改 MAINTAINERS 文件

5、修改 U-Boot 图形界面配置文件

uboot 是支持图形界面配置

LCD 驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。

一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。

总结
①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。
我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
②、我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
③、一般 uboot 中需要解决串口、NAND、EMMC 或 SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
④、在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。
 

u-boot启动流程 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux U-Boot启动流程如下: 1. 开机自检:U-Boot会进行一些硬件自检,例如检查内存、CPU、串口等。 2. 加载U-Boot:U-Boot会从Flash中读取自身代码,并将其加载到内存中。 3. 初始化:U-Boot会初始化一些硬件设备,例如串口、网卡等。 4. 加载内核:U-Boot会从Flash中读取Linux内核,并将其加载到内存中。 5. 启动内核:U-Boot会将控制权转交给内核,并启动Linux系统。 6. 内核初始化:Linux内核会进行一些初始化工作,例如初始化进程、文件系统等。 7. 用户空间初始化:Linux内核会启动init进程,并初始化用户空间。 8. 用户空间运行:Linux系统启动完成后,用户可以在用户空间中运行应用程序。 ### 回答2: Linux系统的启动流程分为UEFI与BIOS两种模式,而最重要的启动阶段便是uboot启动阶段。uboot是一款开源的嵌入式操作系统的引导程序,它可以加载并启动Linux操作系统。接下来我们深入了解一下Linux uboot启动流程。 1. 启动元件的初始化 uboot首先进行启动元件的初始化,启动元件包括RAM、Flash、UART、NAND Flash、SD卡等。它通过初始化它们,来保证它们可以被操作系统正常使用。 2. 加载uboot的参数 接下来uboot会读取启动设备上固定的位置文件system.map。这个文件中记录着uboot所需要的各种参数,例如内存信息、启动设备的信息等。uboot会将这些参数加载到内存中,以便执行下一步操作。 3. 加载内核 uboot接着会从启动设备的固定位置读取内核文件,并将内核加载到内存中的指定位置。同时,它还会设置Linux内核的启动参数,例如根分区的位置、启动命令行参数等。当内核被完全加载到内存中后,uboot会将控制权转交给内核。 4. 内核启动 内核将被启动,开始执行初始化任务和启动服务。它会根据uboot传递的参数信息,找到根文件系统分区,并将其挂载到根目录下。接着,内核会继续启动Deamon(服务)进程,例如SSH服务,以便与用户进行交互。在一些需要应用程序自启的系统中,内核也会启动一些相应应用程序。 总之,Ubuto的启动流程就是先初始化启动元件,然后加载uboot的参数,加载内核,最后启动内核,让其运行Linux操作系统。这样,Linux操作系统就完成了从uboot到内核的启动过程,准备好与用户进行交互使用。 ### 回答3: 在嵌入式设备中,U-Boot是一种常用的开源启动引导程序,通常用于在Linux系统上启动操作系统。下面就是Linux U-Boot启动流程。 1. 加载启动程序。当设备上电时,CPU会将引导ROM中的第一条指令加载到CPU的寄存器中执行,这个指令会将U-Boot启动程序加载到RAM中。 2. 硬件初始化。开始运行U-Boot启动程序时,首先需要初始化硬件。U-Boot通过硬件抽象层(HAL)完成这些操作,例如:内存初始化、外设初始化、CPU时钟初始化等。 3. 加载设备树。设备树是一种描述硬件以及软件之间联系的机器可读文本文件,U-Boot从存储设备中读取设备树文件并将其加载到内存中。 4. 加载内核。U-Boot启动程序会尝试从存储设备中读取内核。在加载内核之前,需要确定内核的位置、大小以及参数。 5. 加载根文件系统。内核启动时需要知道根文件系统的位置,并将其加载到内存中。 6. 启动内核。一旦内核和根文件系统被完全加载到内存中,U-Boot会将内核的控制权交给内核,此时内核会从RAM中读取U-Boot加载的设备树信息。 7. 系统初始化。内核启动后,会开始进行系统级别的初始化,例如挂载根文件系统、启动初始化脚本等。 8. 用户程序启动。一旦初始化完成,系统就会启动用户程序,此时用户可以通过终端界面或其他方式与设备进行交互。 这就是Linux U-Boot启动流程,了解这些流程可以帮助开发者更好地理解嵌入式系统的启动过程,以及如何针对系统进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值