Linux系统移植(1)
一、u-boot工程
1.BootLoader介绍
BootLoader是操作系统运行之前要执行的一段程序,它复制初始化硬件设备、建立内存空间映射,为操作系统的运行做好准备,是一个专门加载操作系统的程序。
对于嵌入式系统而言,没有通用的硬件平台,因此也没有通用的BootLoader,不同的平台、CPUyi架构都有不同的BootLoader,因为BootLoader不光依赖CPU的体系结构,也以来硬件平台的配置,对于不同的开发板而言,哪怕它的CPU一样,BootLoader也会有区别,因此我们为每一款开发板制作属于它的BootLoader程序。
但大部分开发板的BootLoader仍有许多共性,所以我们没有必须全部从零制作,而对一个基础的BootLoader进行修改,制作出能用的BootLoader程序。
2.u-boot简介
u-boot( Universal Boot Loader)是BootLoader的一种,它遵循GPL通用许可证的开源项目,它的源码的目录、编译形式都和Linux的源码很相似,可以说u-boot就是仿照Linux开发的。
3.u-boot源码的获取
① 源头的代码是u-boot官网下载的,这种源码是最干净最存粹的,一般CPU 的生产厂商会下载这种源码。
当CPU厂商生产出一款CPU之后就会使用这款CPU制作出一块公板(它会把这款CPU所具备的功能全部体现出来)。
然后根据公板修改出一份符合它的u-boot。
② 开发板的供应商会购买CPU厂商的公板,然后对公板进行裁剪(去掉一些不需要的功能、替换掉一些不必要的硬件),然后根据裁剪后开发板有厂商提供的u-boot进行修改,从而制作出属于这款开发板的u-boot。
③ 官网、CPU厂商、开发板厂商 可以获取u-boot源码。
4.u-boot源码结构
顶层的u-boot源有30多个目录,大致分为三类:
① 与CPU体系结构或开发板硬件直接相关的代码
arch:和体系结构相关代码,如arm、avr32、mips、openrise、powerpc及x86.
board:目标板相关我你就按,主要包含一些内存驱动。
include:U-Boot头文件,尤其是config子目录下与目标板相关的配置头文件是移植过程中经常要求改的文件。
② 通用的函数、驱动程序
common:独立与处理器体系结构的通用代码,如内存大小探测与故障检测。
driver:通用 所支持的设备驱动,如CFI FLASH驱动(目前对INTEL FLASH支持较好),网卡。
fs:包含文件系统(管理硬盘上文件的程序)的代码。
lib:与处理器体系无关的库文件,如md5、CRC等算法实现。
lib_generic:通用的库函数。
net:与网络功能相关的文件目录,有简单4层网络协议栈的实现,如arp、bootp、nfs和tftp等。
post:上电自检文件目录,尚有待完善。
disk:对磁盘的支持。
③ U-Boot应用程序、工具、测试程序或文档
api:API接口,为其他应用提供的与机器类型、体系结构无关的API。
doc:U-Boot的说明文档。
examples:可在U-Boot下运行的示例程序,如hello_world.c和timer.c
test:测试脚本和代码。
tool:用于创建U-Boot S-RECORD和BIN镜像文件的工具。
5.uboot的配置编译
通过Makefile组织编译的,顶层的Makefile可以对开发板进行整体配置,然后递归调用各级目录下的Makefike,最后把所有编译过的代码链接成uboot镜像。
注意:编译前确定交叉编译,Makefile的147行
① 清理之前的编译残留
make distclean
② 配置编译方法
make x210_sd_config
注意:chm +x mkconfig 加执行权限
③ 多线程编译
make -jn 一般n是CPU内核数量的2倍。
6.uboot的运行
① uboot是ELF格式的,而uboot.bin才是纯二进制指令格式的
② uboot.bin并不能直接运行,原因是没有添加校验和,而且之前添加的校验和的工具不能继续使用。
③ sd_fusing目录中有为u-boot.bin添加校验和的工具,但把并不能直接使用,需要在makefile添加以下指令:
291 all: