本来打算一章一章地看过来,没想到还是碰到了很多困难,中间的像总线、LCD控制器什么的还是有很多地方看不太懂。于是就跳过来了。。。
1.什么是bootloader?
bootloader就是一段在系统上电就开始执行的一段小程序。所做的工作有:初始化硬件设备、准备好软件环境,最后调用操作系统内核。
当然,我们也可以增强bootloader的功能,比如增加网络功能、烧写文件等等。因为bootloader的实现非常依赖硬件,因此必须对bootloader进行修改(移植)才能使用。
2.bootloader的两个阶段
bootloader的启动分为单阶段(single stage)和多阶段(multi-stage)两个部分,其中第一阶段使用汇编实现,能够完成一些依赖于cpu体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言实现,可以实现更加复杂的功能。两阶段完成功能分类如下:
(1)第一阶段
- 硬件设备初始化
- 为加载bootloader的第二阶段代码准备ram空间
- 复制bootloader的第二阶段代码到ram中
- 设置好栈
- 跳转到第二阶段代码的C入口点
(2)第二阶段
- 初始化本阶段要使用到的硬件设备
- 检测系统内存映射
- 将内核映像和根文件系统映像从flash上读到ram空间中
- 为内核设置启动参数
- 调用内核
3.bootloader与内核的交互
bootloader与内核的交互是是通过将参数放在某个约定的地方,以规定的参数结构来单向传递给内核。目前均以标记列表(tagged list)的形式来传递启动参数。标记列表以ATAG_CORE开始,以标记ATAG_NONE结束。
tag和tag_header的定义在linux内核源码的include/asm/setup.h 中,如下
struct tag_header{ u32 size; u32 tag; }; struct tag{ struct tag_header hdr; union{ struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag_ramdisk ramdisk; struct tag_initrd initrd; struct tag_serialnr serialnr; struct tag_revision revision; struct tag_videolfb videolfb; struct tag_cmdline cmdline; struct tag_acorn acorn; struct tag_memclk memclk; }u; };
标记列表则是很多个这种结构的标记连接而成的。
未完。。。