u-boot(一)启动简介
u-boot(一)启动简介
启动概述
U-boot的终极目的,是从FLASH中读出内核,加载到SDRAM中
系统 | ||||
---|---|---|---|---|
Win | BIOS | 引导win | 识别C盘等 | 运行应用程序 |
Linux | Bootloader | 引导启动linux内核 | 挂载根文件系统 | 运行应用程序 |
阶段一引导
这里包含芯片自身的引导,BIOS固件的引导,以及bootloader的引导,jz2440这里首先可能有4ksram的搬运,然后执行sram的程序,或者直接是Bootloader.所以Bootloader目的就是加载内核,传递内核参数
阶段二Linux内核
内核的启动参数分为固定参数和Bootloader传递参数.
阶段三文件系统
应用程序都是存放在文件系统上的,不像win的C盘D盘,linux的目录结构就是一个树形,树形的顶部也就是/
,这个称之为根文件系统,根文件系统有一些特殊的含义,比如shell
命令等都是在根文件系统中存放的.
文件系统包含了应用程序,以及库,和动态链接需要的glibc或者Uclibc等.
阶段四应用程序
跑到这里,就是我们自己的应用程序执行的时候了.
内部存储布局
常见的内部空间布局如下:
Bootloader | Boot parameters | Kernel | Root filesystem |
---|---|---|---|
u-boot,它会在内存的某个地方存放着内核启动的一些参数,也称为tag | u-boot 参数,包含传递给内核的一些东西 | 内核 | 根文件系统 |
Bootloader概述
一般情况下,Bootloader分为两个阶段,第一个阶段为汇编阶段,我理解为为C语言提供环境.第二个阶段就是C语言的阶段,实现复杂的功能.
- 汇编阶段
- 硬件初始化,比如关看门狗,设置时钟(这个也可以在C阶段)
- 如果Bootloader需要在SDRAM中运行,则需要①sdram驱动②搬运代码到sdram
- 设置C函数调用、运算所需要的栈(Sp)
- C阶段
- 初始化硬件设备
- 内存映射,这里指的是检测内存有多大,告诉内核
- 读取内核
- 读取根文件系统,有些格式的根文件系统不需要复制到RAM
- 设置启动参数,启动内核
- 内核启动须知
- 内核入口函数有三个参数,所以R0=0,R1=机器ID,R2=启动参数的内存地址
- CPU处于SVC模式,禁止中断
- Cache和MMU
- MMU必须关闭
- 指令cache不相关
- 数据Cache关闭
内核启动参数 taggedlist
内核是这么读取参数的:
- 先判断是什么类型的参数,长度为多少
- 将读取指定长度的内容识别为该格式的参数
所以很自然的,内存单元的参数就是
size
tag
data
体验一下实际的Uboot
- 解压官方源码,注意这里是
u-boot-1.1.6
,不是u-boot-2012.04.01_100ask
- 使用补丁包
- 配置并编译
tar xjf u-boot-1.1.6.tar.bz2
cd u-boot-1.1.6/
patch -p1 <../u-boot-1.1.6_jz2440.patch #p1表示忽略应用位置第一个父目录,具体参考diff补丁格式
make 100ask24x0_config
make
-
烧录,
oflash
到nandflash或者norflash -
备份下补丁文件(压缩文件包)
U-boot的使用帮助
-
使用命令
q
退出菜单,命令menu
进入菜单 -
使用
help
查看所有命令 -
退出菜单后可以使用
?
或者help
+具体命令
来查看帮助 -
使用
print
或者printenv
来查看环境变量,使用set
命令来设置环境变量,比如使用倒计时时间set bootdelay 8
,注意需要最后使用save
来保存
U-boot基本要求
核心功能
- 需要有FLASH读取的能力,内核存储在FLASH
- 能够操作SDRAM,将读取到的内核加载到SDRAM
需要以下程序模块
- 初始化时钟,看门狗等其他基本操作
- 支持串口方便调试
- 读写FLASH
- 读写SDRAM
- 其他模块,比如网卡,USB等,支持内核烧写