实验九 BootLoader实验.docx
- 文档编号:26139003
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:17
- 大小:1.19MB
实验九 BootLoader实验.docx
《实验九 BootLoader实验.docx》由会员分享,可在线阅读,更多相关《实验九 BootLoader实验.docx(17页珍藏版)》请在冰豆网上搜索。
实验九BootLoader实验
实验九BootLoader实验
【实验目的】
1、了解BootLoader的基本概念和框架结构
2、了解BootLoader引导操作系统的过程
3、掌握bootloader程序的编译方法
4、掌握BootLoader程序的使用方法
【实验原理】
1、bootLoader的作用
PC机中的引导加载程序由BIOS和位于硬盘MBR中的OSBootLoader一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OSBootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务完全由bootLoader来完成。
bootloader的主要作用:
(1)、初始化硬件设备
(2)、建立内存空间的映射图
(3)、完成内核的加载,为内核设置启动参数
2、bootLoader程序结构框架
嵌入式系统中的bootLoader的实现完全依赖于CPU的体系结构,因此大多数BootLoader都分为第一阶段和第二阶段两大部分,依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在阶段1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而阶段2则通常用C语言来实现,这样可以实现一些复杂的功能,而且代码会具有更好的可读性和可移植性。
(1)、BootLoader的阶段1通常主要包括以下步骤:
●硬件设备初始化;
●拷贝BootLoader的程序到RAM空间中;
●设置好堆栈;
●跳转到阶段2的C入口点。
(2)、BootLoader的阶段2通常主要包括以下步骤:
●初始化本阶段要使用到的硬件设备;
●系统内存映射(memorymap);
●将kernel映像和根文件系统映像从Flash读到RAM空间中;
●为内核设置启动参数;
●调用内核。
3、bootLoader程序架构分析
3.1BootLoader阶段1分析
(1)基本的硬件初始化
BootLoader一开始就执行基本硬件初始化操作,其目的是为阶段2的执行以及随后的内核的执行准备好一些基本的硬件环境。
它通常包括以下步骤:
●初始化GPIO功能,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。
如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。
(参考fixgpio.S)
●设置CPU的速度和时钟频率。
(参考setup_memory.S部分代码)
●存储控制单元初始化。
包括正确地设置系统动静态存储控制器的各个寄存器等。
(2)、将bootLoader程序加载到RAM空间
(3)、设置堆栈指针sp
堆栈指针的设置是为了执行C语言代码作好准备。
通常我们可以把sp的值安排在RAM
空间的最顶端(堆栈向下生长)。
此外,在设置堆栈指针sp之前,也可以关闭led灯,以提示准备跳转到阶段2。
经过上述这些执行步骤后,系统的物理内存布局应该如图3-1所示。
图3-1系统的物理内存布局
(4)、跳转到阶段2的C入口点
在上述一切都就绪后,就可以跳转到BootLoader的阶段2去执行了。
在ARM系统中,
可以通过修改PC寄存器为合适的地址来实现。
3.2BootLoader阶段2分析
阶段2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。
但是与普通C语言应用程序不同的是,在编译和链接BootLoader程序时,不能使用glibc库中的任何支持函数。
可以直接把main()函数的起始地址作为整个阶段2执行映像的入口点。
(1)、初始化本阶段要使用到的硬件设备;
本阶段初始化的硬件设备通常包括:
●初始化至少一个串口,以便和终端用户进行I/O输出信息;
●初始化计时器、
●初始化网络传输等。
在初始化这些设备之前,也可以重新把LED灯点亮,以表明程序bootLoader程序已经进入main()函数执行。
设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。
(参考main.c文件)
(2)、系统的内存映射
所谓内存映射就是指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元。
虽然CPU通常预留出一大段足够的地址空间给系统RAM,但是在搭建具体的嵌入式系统时却不一定会实现CPU预留的全部RAM地址空间。
也就是说,具体的嵌入式系统往往只把CPU预留的全部RAM地址空间中的一部分映射到RAM单元上。
开发板的bootloader程序利用map__bsetupparts[]结构体对内存的分配进行配置(参考partition.c),从内存分布可以看出,PXA27X开发板SRAM和SDRAM起始地址的存储分布情况:
bootloader:
0x00000000_0x00040000,共占256K,SDRAM起始地址:
0xA1E00000
kernel:
0x00040000_0x00180000,共占1.25M,SDRAM起始地址:
0xA0008000
root:
0x00180000_0x02000000,共占30.5M,SDRAM起始地址0xA0000000
(3)、加载内核映像和根文件系统映像
●规划内存占用的布局
这里包括两个方面:
①内核映像所占用的内存范围;②根文件系统所占用的内存范围。
在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。
对于内核映像,一般将其拷贝到从(MEM_START+0x8000)这个基地址开始的大约1MB大小的内存范围内(嵌入式Linux的内核一般都不操过1MB)。
为什么要把从MEM_START到MEM_START+0x8000这段32KB大小的内存空出来呢?
这是因为Linux内核要在这段内存中放置一些全局数据结构,如:
启动参数和内核页表等信息。
而对于根文件系统映像,则一般将其拷贝到MEM_START+0x00100000开始的地方。
如果用Ramdisk作为根文件系统映像,则其解压后的大小一般是1MB。
(4)、设置内核的启动参数
应该说,在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动Linux
内核了。
但是在调用内核之前,应该作一步准备工作,即:
设置Linux内核的启动参数。
Linux2.4.x以后的内核都倾向以标记列表(taggedlist)的形式来传递启动参数。
启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束。
每个标记由tag_header结构和随后的特定参数值数据结构来组成。
(参考文件:
linux.c)
在嵌入式Linux系统中,通常需要由BootLoader设置的常见启动参数有:
ATAG_CORE、
ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。
比如,设置ATAG_CORE的代码如下:
其中,BOOT_PARAMS表示内核启动参数在内存中的起始基地址,指针tags是一个structtag类型的指针。
宏tag_next()将以指向当前标记的指针为参数,计算出当前标记的下一个标记的起始地址。
注意,内核的根文件系统所在的设备ID就是在这里设置的。
下面是设置ATAG_INITRD的示例代码,它告诉内核在RAM中的什么地方可以找到initrd映象(压缩格式)以及它的大小:
最后,设置ATAG_NONE标记,结束整个启动参数列表:
(5)、调用内核
BootLoader调用Linux内核的方法是直接跳转到内核的第一条指令处,也即直接跳转
到MEM_START+0x8000地址处。
在跳转时,下列条件要满足:
●CPU寄存器的设置:
R0=0;
R1=机器类型ID;关于机器类型号,可以参见linux/arch/arm/tools/mach-types;
R2=启动参数标记列表在RAM中起始基地址;
●CPU模式:
必须禁止中断(IRQs和FIQs);
CPU必须SVC模式;
●Cache和MMU的设置:
MMU必须关闭;
指令Cache可以打开也可以关闭;
数据Cache必须关闭;
如果用C语言,可以像下列示例代码这样来调用内核:
(粗体表示)
【实验仪器】
1、装有Linux操作系统的PC机一台;
2、XSBase270或XSBase255ARM实验开发平台一套
【实验内容】
1、bootLoader程序的编译
为了编译Bootloader程序,需要事先在目标板上安装交叉编译工具Toolchain。
(见linux使用手册Toolchain安装部分)。
(1)、利用tarzxvfBoot-XSBase270.tar.gz指令解压。
[root@localhostBootLoader]$tarzxvfBoot-XSBase270.tar.gz
利用上述命令解压后,bootloader源代码解压到当前目录中Boot-XSBase270文件夹中。
(2)、编译。
在解压的目录里进行make编译。
[root@localhostBootLoader]$cdBoot-XSBase270
[root@localhostBoot-XSBase270]$make
编译完成后,在当前目录下会生成bootloader映象文件boot。
2、bootLoader程序的下载
将bootloader的映象文件boot拷贝Jflash-XSBase270目录下,连好JTAG下载器,并利用Jflash-XSBase270目录中jflashmm程序将bootloader映象文件boot烧写到开发板上。
[root@localhostBoot-XSBase270]$cpboot/root/EmdoorARM/Jflash/Jflash-XSBase270/
[root@localhostBoot-XSBase270]$cd/root/EmdoorARM/Jflash/Jflash-XSBase270
[root@localhostBoot-XSBase270]$./jflashmmboot
3、bootLoader的使用方法
Bootloader命令的使用方法。
help
用法
帮助
描述
简短显示各命令的介绍
参数
无
举例
Bboot>Help
Load
用法
load[kernel/ramdisk]
描述
把存放在FLASH中的映像文件拷贝到SDRAM中。
在Autoboot
过程中会自动运行,把内核映像从FLASH加载到SDRAM中。
参数
Kernel-把内核映像从FLASH拷贝到SDRAM中
Ramdisk-从FLASH中拷贝RAMDISK到SDRAM
举例
Bboot>loadkernel
bootp
用法
Bootp
描述
运行bootp命令用来获取HOST主机发送的BOOTP的数据包,解析
BOOTP的数据包,获取本机的IP地址
参数
无
举例
Bboot>bootp
tftp
用法
Tftp文件名{address/loader/kernel/root/ramdisk}
描述
通过以太网下载主机的数据或文件到目标平台的SDRAM
参数
文件名-主机平台需要传输的文件名
loader-把传输到目标平台的文件放置在SDRAM的loader区域
kernel-把传输到目标平台的文件放置在SDRAM的kernel区域
root-把传输到目标平台的文件放置在SDRAM的root区域
ramdisk-把传输到目标平台的文件放置在SDRAM的ramdisk区域
address-把传输到目标平台的文件放置在SDRAM的指定地址
举例
Bboot>tftpzImagekernel
flash
用法
Flash{loader/kernel/root/ramdisk}
描述
把SDRAM中的数据烧录到FLASH中特定的地址
参数
loader-把SDRAM中的数据烧录到FLASH中的loader区域
kernel–把SDRAM中的数据烧录到FALSH中的kernel区域
root–把SDRAM中的数据烧录到FLASH中的root区域
ramdisk–把SDRAM中的数据烧录到FLASH中的ramdisk的区域
举例
Bboot>flashkernel
erase
用法
erase{loader/kernel/ramdisk/root}
描述
擦除FALSH中的相应区域
参数
loader–擦除FALSH中loder区域
kernel–擦除FLASH中的kernel区域
root–擦除FLASH中的root区域
ramdisk–擦除FLASH中的ramdisk区域
举例
bboot>erasekernel
boot
用法
Boot
boot[addr]
描述
在SDRAM中运行kernel
通过参数中指定的地址运行kernel
参数
addr–kernelimageaddress
举例
bboot>boot
set
用法
set[name][value]
描述
设置IP地址,MAC地址以及autoboot参数
参数
Name[myipaddr][destipaddr][myhaddr][autoboot]
Value[ip][ip][macaddress][loadkernel;boot]
举例
bboot>set//输出设置信息
bboot>setmyipaddr192.168.100.X//改变目标平台的IP地址
bboot>setdestipaddr192.168.100.XX//改变主机平台的IP地址
bboot>setmyhaddr00:
0E:
6F:
CE:
59:
21//设置目标平台的MAC地址
bboot>setautobootloadkernel;boot//装载kernel后自动启动
ping
用法
Ping
描述
检查目标平台和主机平台的网络连接
参数
Ping主机平台的ip地址
举例
Ping192.168.100.xx
reboot
用法
Reboot
描述
软件复位
参数
None
举例
Reboot
【思考题】
1、分析bootloader源程序中的flash.c代码,画出该代码的流程图
2、利用上个实验Makefile的知识点,分析bootloader源程序三个Makefile的结构与关系
3、某同学在bootloader源程序目录中,利用make编译bootloader源程序,出现如下错误:
[root@hostlocalBoot-XSBase270]make
compilestart.S
make[1]:
arm-linux-gcc:
Commandnotfound
make[1]:
***[start.o]Error127
make:
***[all]Error2
请分析产生错误的原因,并给出解决办法
4、bootloader主要功能有哪些?
5、请在阅读完bootloader程序后,画出bootloader程序框架流程.。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验九 BootLoader实验 实验 BootLoader