bootloader作为内核引导程序,先于内核运行。程序存在位置0x0000 0000。可以运行在ram,和flash空间。
1。运行于ram空间
bootloader分为头部和主体2部分。头部包括中断向量,系统初始化部分(初始化SDRAM等)。主体包括bootloader功能的具体实现代码。头部把主体程序段加载到SDRAM空间,然后跳转到SDRAM中的主体程序开始部分。
2。运行于flash空间
bootloader程序的主体部分仍然在flash中运行。需要说明的是,bootloader程序的bss段还是需要分配在SDRAM的某个空间。不管程序在哪里运行,需要的SDRAM都不可能由flash提供。
bootloader的运行
1。加载kernel
bootloader可以通过串口,网口,USB口等等通讯口,完成内核从主机的下载。下载内核的存放位置必须是在SDRAM中。下载后,内核可以在SDRAM中直接运行,也可以写到flash中。
2。加载文件系统
如果内核使用ramdisk作为根,那么bootloader可以把文件系统从主机或者flash中加载到SDRAM中的ramdisk中。这样启动内核时就可以访问ram0了。
还有一点就是在uclinux中对romfs的支持。直接把romfs编译到内核里面,在调试阶段很不方便。通常采用在内核中使用固定的物理地址指明 romfs的起始位置。而在该位置上初始化romfs仍然是由bootloader完成的。在调试阶段,最好把romfs的起始位置定在SDRAM中;而发布阶段,bootloader把下载的romfs写到flash中即可。
特别注意:bootloader在SDRAM中运行时,一般会把自己加载到内存的末端。因此该段内存在bootloader运行期间是不允许被覆盖的!!比如bootloader运行于0x0c70 0000,内核为1.5M,如果加载的地址为0x0c60 0000,则发生内存冲突。bootloader崩溃。
-- 原文链接: http://blog.21ic.com/more.asp?name=good02xaut&id=12527
|