• 嵌入式开发环境之uboot


    目录

    1.uboot

    1.1uboot是用来干什么的,有什么作用?

    1.2.uboot是怎样引导启动内核的?

    1.3.uboot启动的大过程是怎么样的?

    1.4,跳到入口地址,启动内核

    1.5.uboot获取

    2.编译uboot


    1.uboot

    uboot简单来说,和我们平时了解的bios差不多,是用来引导启动内核,环境初始化(内存赋值)这些可能在内核代码里面做,可能在uboot或者bios里面做都是有可能的。

    1.1uboot是用来干什么的,有什么作用?

    uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。

    1.2.uboot是怎样引导启动内核的?

    uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,执行应用程序。

    1.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为命令行信息,

    1.4,跳到入口地址,启动内核

    启动的函数为the_kernel(0,bd->bi_arch_number,bd->bi_boot_param)

    bd->bi_arch_number为板子的机器码,bd->bi_boot_param为启动参数的地址

    1.5.uboot获取

    1.去uboot官网下载,uboot会不断维护更新,更新也快 ---驱动少

    2.uboot可能对一些芯片不支持,因为芯片太多了,可以去芯片厂商去下载对应的uboot(soc厂商会去uboot官网下载其中一个版本下来,然后进行修改,加上驱动),成为soc厂商自己的uboot。--驱动多

    3.做开发板的厂商,开发板厂商会参考soc的开发板,在soc的开发板基础上的uboot进行修修补补,得到属于开发板厂商自己的板子的uboot。

    正常来说是这三个途径是比较权威,当然也有很多大佬自己写,这种是比较特殊了。

    2.编译uboot

    将uboot源码拷贝到linux下面,然后解压linux源码。

    #解压

    tar -zxvf 压缩包

    #设置make 参数 进行清理过程 

    make ARCH=arm CROSS_COMPILE =arm-linux-gnueabihf- distclean

    #配置uboot 使用默认配置文件进行配置

     make ARCH=arm CROSS_COMPILE =arm-linux-gnueabihf-  mx6null_14x14_ddr512_emmc_defconfig

    # V=1就是打印信息 j12 12核编译  

    make V=1 ARCH=arm CROSS_COMPILE =arm-linux-gnueabihf-  -j12 

    # 其他 方法

    1.可以使用uboot通过makefile,然后在里面进行配置变量,直接make

    2.有一些会提供build.sh脚本文件,我们只需要执行这个脚本就可以了。

    查看cpu核心数: 

     Linux通过编程获取CPU核数_@seven@的博客-CSDN博客_linux获取cpu核数接口

     上面命令之后会生成uboot.bin文件。

    正点原子开发板需要在uboot前面添加头部信息才可以。uboot提供了软件可以添加头部信息(uboot会自己做)变成u-boot.ims文件,这个就是我们要烧录的uboot程序。然后进行烧录即可,怎么烧录的,看我的另一篇文章。

    嵌入式开发环境之系统烧录_@seven@的博客-CSDN博客

  • 相关阅读:
    类之间的关系
    如何遍历HashMap集合?
    Hadoop分布式文件系统-HDFS
    使用riscv-tests进行指令测试(二)
    轻量化动态编译库 Natasha v8.0 正式发布!
    Webpack 安装教程
    python 安装使用 IntelliJ IDEA插件python
    python基于百度sdk语音转文字
    STM32实战总结:HAL之GPIO
    【深度学习】You Only Segment Once: Towards Real-Time Panoptic Segmentation,YOSO全景分割
  • 原文地址:https://blog.csdn.net/m0_46392035/article/details/126695344