深入浅析Linux下uboot之(一)-----------------------:前世今生(启动流程总结)

什么是uboot:

uboot就是universal bootloader(通用的启动代码),通用的意思就是说uboot具有可移植性。具有在源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以在这个开发板上使用。uboot是SourceForge上的开源项目,是一个德国人最早发起的项目,被许多人认可使用,然后由整个网络上所有感兴趣的人共同维护发展而来的一个bootloader。在大部分的嵌入式设备都会默认使用uboot来做为bootloader。

uboot的作用:

  • uboot主要作用是用来启动操作系统内核:linux内核在设计的时候,设计为可以被传参。也就是说我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
  • 负责部署整个计算机系统:uboot必须能够被人借助而完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。
  • 能进行soc级和板级硬件管理:SoC级(譬如串口)就是SoC内部外设,板级就是SoC外面开发板上面的硬件(譬如网卡、I2C等)。uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。
  • 可以提供一个命令行界面供人来操作(shell):有些程序需要和人进行交互,uboot就实现了一个shell。

uboot的大小和生命周期:

  • uboot的大小:正常在180k-400k之间。
  • uboot生命周期:uboot在板子开机后自动启动,启动内核后uboot就结束了它的一生。(uboot在运行时,别的程序是不可运行的,一旦结束,就无法返回uboot,想要在看到刚才的uboot,只能重启整个系统,重启只是uboot的另一生)。

uboot的工作过程:

uboot的本质是一个裸机程序,由若干个.c和.h文件,配置编译后生成uboot.bin文件,这个就是uboot的镜像文件,然后这个镜像被合理的烧录到启动介质(flash)中,板子启动后flash会把uboot加载到SRAM中运行,uboot在SRAM运行时,会初始化时钟、初始化DDR动态内存、初始化硬件设备(网卡、串口等)、重定位(uboot镜像从flash搬运到DDR中继续运行前)、建立映射表并开启MMU等,最后可以阻塞在shell终端,或者直接启动内核。

FLASH、SRAM、DDR又是什么:

FLASH是什么

FLASH闪存是属于内存器件的一种,"Flash"。闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘。NOR和NAND是市场上两种主要的非易失闪存技术。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

这里我们主要来介绍NorFlash:NOR flash占据了容量为1~16MB闪存市场的。大部分带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。在uboot中是没有操作系统的,因此我们对Flash(相当于硬盘)的管理必须事先使用分区界定,也就是所谓的分区,各分区的大小由系统移植工程师自己来定,一般定为合适大小(不能太小,太小了容易溢出;不能太大,太大了浪费空间),其分区内容如下:

  • uboot:uboot必须在Flash开头,一般设计为512KB或者1MB(因为一般uboot肯定不足512KB,给再大其实也可以工作,但是浪费)
  • kernel:kernel可以紧贴环境变量存放,大小一般为3MB或5MB或其他
  • rootfs:根文件镜像,大小根据个人需求,一般紧贴在 kernel 存放。
  • 自由分区:一般kernel启动后将自由分区挂载到rootfs下使用

flash在uboot的主要作用是存放uboot、kernel、rootfs等的镜像文件,然后板子开启后,会把uboot的前一部分(前8k或者前16k)加载到SRAM运行。

SRAM是什么:

静态随机存取存储器Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持,当电力供应停止时,SRAM储存的数据还是会消失。上电后就可以读写SRAM中的数据,无需初始化操作。

SRAM在uboot的主要作用是,板子开启后,SRAM自动运行flash中uboot的前一部分(前8k或者前16k),这8k或者16k大部分是uboot的第一阶段(uboot的启动可以分成两个阶段);第一阶段里面实现了:

  • 构建异常向量表
  • 设置CPU为SVC模式
  • 关看门狗
  • 开发板供电置锁
  • 时钟初始化
  • DDR初始化
  • 串口初始化并打印"OK"
  • 重定位
  • 建立映射表并开启MMU
  • 跳转到第二阶段

SRAM对DDR初始化后,会根据重定位的地址,把flash中的整个uboot复制到DDR中去运行,并根据重定位的偏移地址,实现远跳转,把pc指针的值定位到DDR中的uboot的第二阶段去运行。主要来说SRAM完成了uboot启动的第一阶段。uboot第一阶段主要就是初始化了板子内部的一些部件(譬如看门狗、时钟),然后初始化DDR并且完成重定位。

什么是DDR(SDRAM):

同步动态随机存取内存(synchronous dynamic random-access memory,简称SDRAM)是有一个同步接口的动态随机存取内存(DRAM)。需要不断的刷新,才能保存数据,并且需要对DDR控制器进行初始化<配置寄存器>,才能去读写SDRAM中的数据。

uboot中是没有操作系统的,所以DDR也是要分区的。DDR内存的分区主要是在linux内核启动起来之前,linux内核启动后内核的内存管理模块会接管整个内存空间,那时候就不用我们来管了。和Flash的分区不同,主要是因为Flash是掉电存在的,而DDR是掉电消失,因此可以说DDR是每次系统运行时才开始部署使用的。注意内存分区关键就在于内存中哪一块用来干什么必须分配好,以避免各个不同功能使用了同一块内存造成的互相踩踏。

DDR在uboot的主要作用是:DDR完成了uboot启动的第二阶段。uboot的第二阶段就是要初始化剩下的还没被初始化的硬件。主要是板子外部硬件(譬如网卡芯片····)、uboot本身的一些东西(uboot的命令、环境变量等····)然后最终初始化完必要的东西,最终阻塞在shell终端,或者直接启动内核。

uboot在启动完成之后,如果用户没有干涉则会执行bootcmd进入自动启动内核流程(uboot就死掉了);此时用户可以按下回车键打断uboot的自动启动进入uboot的命令行下。然后uboot就一直工作在命令行下。uboot的命令行就是一个死循环,循环体内不断重复:接收命令、解析命令、执行命令。所以uboot最终的归宿是阻塞在shell终端,或者直接启动内核。

总之,uboot的主要作用就是为了引导启动内核。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值