读书笔记
嵌入式BootLoader技术内幕:
嵌入式系统从软件层次上包括4个部分:
1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。
4. 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
引导加载程序是系统加电后运行的第一段软件代码.
以PC机为例,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘MBR(Main Boot Record 主引导记录--位于硬盘第一个分区第一个个扇区前512个字节)中的OS Boot Loader(比如,LILO和GRUB等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的Boot Loader读到系统的RAM 中,然后将控制权交给OS Boot Loader。OS Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS 那样的固件程序(注,有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。
Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):
- 硬件设备初始化。
- 为加载Boot Loader的stage2准备RAM 空间。
- 拷贝Boot Loader的stage2 到RAM 空间中。
- 设置好堆栈。 --为stage2执行C语言代码作好准备
- 跳转到 stage2的C入口点。
Boot Loader的stage2 通常包括以下步骤(以执行的先后顺序):
- 初始化本阶段要使用到的硬件设备。
- 检测系统内存映射(memory map)。
- 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。
- 为内核设置启动参数。
- 调用内核。
内核映像和根文件系统映像拷贝到 RAM 空间中后,就可以准备启动 Linux 内核了,可是,这一点不明白:内核映像还是个映像,怎样将内核启动,仅仅是bootloader将控制权跳到内核加载的位置吗?
Boot Loader 的设计与实现是一个非常复杂的过程。如果不能从串口收到那激动人心的
"uncompressing linux
.................. done,
booting the kernel……"
内核启动信息,恐怕谁也不能说:"嗨,我的boot loader 已经成功地转起来了!"
评论
发表评论