
Bootloader移植关键技术分析.docx
28页学 号:题 目 Bootloader 移植关键技术分析学 院 信息工程学院课 程 论 文 专 业 电子信息工程班 级姓 名指导教师2017 年 6 月 6 日Bootloader 移植关键技术分析1 bootloader 简介(1)bootloader在嵌入式操作系统中,BootLoader 是在操作系统内核运行之前运行可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 BootLoader 来完成Bootloader 是嵌入式系统在加电后执行的第一段代码,在它完成 CPU 和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行[1] 对于嵌入式系统,Bootloader 是基于特定硬件平台来实现的因此,几乎不可能为所有的嵌入式系统建立一个通用的 Bootloader,不同的处理器架构都有不同的 Bootloader。
Bootloader 不但依赖于 CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置对于 2 块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的 Bootloader 程序也能运行在另一块板子上,一般也都需要修改 Bootloader 的源程序反过来,大部分 Bootloader 仍然具有很多共性,某些 Bootloader 也能够支持多种体系结构的嵌入式系统例如,U-Boot 就同时支持PowerPC、ARM、MIPS 和 X86 等体系结构,支持的板子有上百种通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1、 引导加载程序包括固化在固件(firmware)中的 boot 代码( 可选),和BootLoader 两大部分2、Linux 内核特定于嵌入式板子的定制内核以及内核的启动参数3、 文件系统包括根文件系统和建立于 Flash 内存设备之上文件系统通常用 ramdisk 来作为 rootfs。
4、 用户应用程序特定于用户的应用程序有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等通常,BootLoader 是严重地依赖于硬件而实现的,特别是在嵌入式世界因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的尽管如此,我们仍然可以对 bootloader 归纳出一些通用的概念来,以指导用户特定的BootLoader 设计与实现2)启动方式CPU 上电后会从某个地址开始执行比如 MIPS 结构的 CPU 会从0xBFC00000 取第一条指令,而 ARM 结构的 CPU 则从地址 0x0000000 开始嵌入式开发系统中,需要把存储器件 ROM 或 Flash 等映射到这个地址,Bootloader 就存放在这个地址的开始处,这样一上电就可以执行在开发时,通常需要使用各种命令操作 Bootloader,一般通过串口来连接PC 和开发板,可以在串口上输入各种命令,观察运行结果等这也只是对开发人员才有意义,用户使用产品时是不用接口接串口来控制 Bootloader 的从这个观点来看,Bootloader 可以分为以下两种操作模式1)启动加载模式(Boot loading 模式)上电后,Bootloader 从板子上的某个固态存储设备上将操作系统加载到RAM 上运行,整个过程并没有用户的介入。
产品发布时,Bootloader 工作在这种模式下2)下载模式(Downloading 模式)在这种模式下,开发人员可以使用各种命令通过,通过串口连接或网络设备等通信手段从主机下载文件,将他们直接放在内存运行或是烧入 Flash 类固态存储设备中像 Blob 或 U-boot 等这样功能强大的 Bootloader 通常支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换比如 U-boot 在启动时处于正常的启动加载模式,但是,他会延时若干秒,等待终端用户按下任意键,而将 U-boot 切换到下载模式下如果在指定时间内没有用户按键,则 U-boot 继续启动Linux 内核3)Bootloader 启动过程Bootloader 的启动过程可以分为单阶段、多阶段两种通常多阶段的Bootloader 能提供更为复杂的功能及更好的可移植性,从固态存储设备上启动的 Bootloader 大多都是两阶段的启动过程,第一阶段使用汇编来实现,它完成一些依赖于 CPU 体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用 C 语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。
一般而言,这两个阶段完成的功能可以如下分类1)Bootloader 第一阶段的功能硬件设备初始化为加载 Bootloader 第二阶段代码准备 RAM 空间复制 Bootloader 第二阶段代码到 RAM 空间中设置好栈跳转到第二阶段的 C 入口点在第一阶段进行的硬件初始化一般包括:关闭 watchdog、关中断、设置CPU 速度和时钟频率、RAM 初始化等这些都不是必须的,甚至将第二阶段的代码复制到 RAM 空间中也不是必须的,对于 NOR FLASH 等存储设备,完全可以直接在上面执行代码只不过执行效率会相比 RAM 中大大降低2)Bootloader 第二阶段的功能初始化本阶段要使用到的硬件设备检测系统内存映射将系统内核映像和根文件系统映像从 Flash 读到 RAM 空间中为内核设置启动参数调用内核为了方便开发,至少要初始化一个串口以便程序员与 Bootloader 进行交互所谓检测内存映射,就是确定板子上使用了多少内存、他们的地址空间是什么由于嵌入式开发中 Bootloader 多是针对某类板子进行编写,所以可以根据板子的情况直接设置,不需要考虑可以适用于各类情况的复杂算法。
Flash 上的内核映像有可能是经过压缩的,在读到 RAM 之后,还需要进行解压对于有自解压功能的内核,不需要 Bootloader 来进行解压将根文件系统复制到 RAM 中,这不是必须的这取决于是什么类型的根文件系统以及内核访问它的方法将内核放到适当的位置后,直接跳入到它的入口点即可调用内核2 U-BOOT 常用命令(1)U-Boot 的常用命令方法进入 U-Boot 控制界面后,可以运行各种命令,比如下载文件到内存,擦除、读写 Flash,运行内存、NOR Flash、NAND Flash 中的程序,查看、修改、比较内存中的数据等使用各种命令时,可以使用其开头的若干字母代替他比如 tftpboot 命令,可以使用 t、tf、tft、tftp 等字母代替,只要其它命令不以这些字母开头即可当运行一个命令后,如果他是可重复执行的(代码中使用 U_BOOT_CMD定义这个命令时,第三个参数是 1)若想再次运行可以直接输入回车U-Boot 接收的数据都是 16 进制的,输入时可省略前缀 0x1)帮助命令 help运行命令可以看到 U-Boot 命令中所有命令的作用,如果要查看某个命令的使用方法,可以运行“help 命令名”来查看。
2)下载命令U-Boot 支持串口下载、网络下载,相关命令有:loadb、loads 、 loadx、loady 和 tftpboot、nfs前几个串口命令使用的方法类似,以 loadx 命令为例,他的使用方法为 loadx [off] [baud][]”表示里面的参数可以省略,off 表示文件下载后存放的内存地址,baud 则表示使用的波特率如果 baud 参数省略,则表示使用当前的波特率如果 off 参数省略,存放的地址为配置文件中定义的宏 CFG_LOAD_ADDRtftpboot 命令使用 TFTP 协议从服务器下载文件,服务器的 ip 地址为环境变量 severip,他的使用方法为 tftp [loadAddress] [bootfilename]loadAddress 表示文件下载后存放的内存地址,bootfilename 表示要下载的文件的名称若loadAddress 省略,存放的地址为配置文件中定义的宏 CFG_LOAD_ADDR;若bootfilename 省略,则使用开发板的 ip 地址构造一个文件名,比如开发板 ip 为192.168.1.17,则默认的文件名为 C0A800711.img。
Nfs 命令使用 NFS 协议下载命令,用法为 nfs [loadAddress] [host ip addr:bootfilename]其中 host ip addr 表示服务器地址3)内存操作命令常用的命令有:查看内存命令 md、修改内存命令 md、填充内存命令mw、复制命令 cp这些命令都可以带上后缀 “.b”“.w”“.l”表示以字节、字、双字为单位进行操作其中,md 命令用法为 md[.b,.w,.l] address [count]表示以字节、字、双字为单位,显示从地址 address 开始的 count 个内存数据mm 命令的用法为 md[.b,.w,.l] address表示以字节、字、双字为单位,从地址 address 处开始修改内存数据,执行 mm 命令后,输入新数据并回车后,地址会自动增加,按 ctrl+C 退出cp 命令用法为 cp[.b,.w,.l] source target count表示以字节、字、双字为单位,从源地址 source 开始的内存复制 count 个数据到目的地的内存4)NOR Flash 操作命令常用的命令有查看 Flash 命令的 flinfo 命令、加/解写保护命令 protect、擦除命令 earse。
由于 NOR Flash 的接口与一般内存相似,所以一些内存命令可以在 NOR Flash 上使用,比如读 NOR Flash 时可以使用 md、cp 命令,写 NOR Flash 时则可以使用 cp 命令直接运行 flinfo 即可看到 NOR Flash 的信息,有 NOR Flash 的 型号、容量、各扇区的开始地址、是否只读等信息对于只读的扇区,在擦除、烧写他之前,要先解除写保护erase 命令的常用格式为 erase start end,擦除的地址为 start-enderase all,表示擦除所有 NOR Flash5)NAND Flash 操作命令NAND Flash 操作命令只有一个:nand根据不同参数进行不同的操作,比如擦除、读取、烧写等nand info,查看 NAND Flash 的信息nand erase [clean] [off size],擦除 NAND Flashoff size 表示要擦除的开始偏移地址的长度,若省略,则表示要擦除整个 NAND Flashnand read/write[.jffs2] addr off size,表示从 addr 开始的内存中,读或写 size个字节数据,是否加后缀.jffs2 的区别是操作时的 ECC 校验方法不同。
nand dump off ,将 NAND Flash 偏移地址 off 的一个扇区的数据打印出来,包括 OBB 数据3 U-Boot 移植开发板 。
