Bootloader的功能决定了在引导Linux系统时,必须使用bootloader,除非你对linux内核进行了修改。 Bootloader有两个主要功能: - 在发布模式,自动引导linux系统,为系统初始化各种参数。
- 在调试模式,要能够方便的下载内核,引导内核。
Linux系统一定要bootloader支持吗? 答:是的。通用的Linux内核,启动时需要很多参数,这些参数必须通过bootloader传递。而且内核一般是压缩存放到外存上的,从外存到内存的拷贝也是由bootloader完成。 Bootloader为什么不和kernel放到一起呢? 答:不可以这样做。从bootloader的第二个功能就知道,bootloader是不能和内核放到一起。当然,在发布模式时,是可以集成到一起的,通常没必要。 从哪里可以得到bootloader? 答:目前通用的bootloader很多,不论是嵌入式还是桌面系统,比如lilo,grub,blob等。桌面用的bootloader我们就不讨论了,重点说一下嵌入式领域用的bootloader。采用通用的bootloader功能强大,开发容易,而且由专人维护升级,不过多是针对特定的CPU或者特定开发板的。如果是学习,推荐自己开发bootloader。 如何编写自己的bootloader? 答:编写一个bootloader只要能够完成前面提到的两个功能就可以了。分别描述一下这两个功能的实现: - 该功能比较简单,就是从FLASH中拷贝数据到RAM。如果内核的存放不是基于文件系统的,直接采用汇编就可以完成块拷贝。然而如果内核存放在文件系统之上,比如内核存放到了基于ext2文件系统的CF卡上。首先我们的bootloader要能够访问CF卡,然后要能够识别文件系统,只有这样才能正确找到内核文件并拷贝到内存中。
- 该功能一般通过串口实现。对于ARM来说,驱动串口比较容易,直接从主机的串口接收内核数据存放到RAM中,就可以启动内核了。如果需要发布,还要实现把内核从RAM烧写到外存的能力。
为了提高速度,充分挖掘开发板和CPU的潜力,出现了许多用网口和USB接口下载内核的bootloader。使用网口,bootloader必须提供网卡驱动和TCP/IP协议的支持。使用USB接口,需要提高大容量存储类驱动。 为了拓展思路,你也可以使用红外,存储卡接口进行数据下载。使用红外接口,和串口基本一样,无非就是没有了连线。使用存储卡,通常需要文件系统的支持。比如,我们使用XD卡存放内核,在主机交叉编译好内核后,把内核存放到XD卡上。然后将XD卡插到目标板的插槽中,bootloader必须有能力把XD卡上的内核拷贝的RAM中,过程参考功能1的实现。
|