编写bootloader(一)

BootLoader功能: 初始化nandflash,启动内核(转到其入口地址)。
BootLoader要求: BootLoader启动内核时还需要传递给内核一些信息(tag),其中有两个必不可少的内存标记和命令行参数,当然还有一个机器ID,BootLoader传递的机器ID必须和内核支持的机器ID匹配。
需要知道的信息:
1.内核在nandflash中的地址。如果内核是uImage映像文件,跳到uImage起始地址+64就行。
对于Linux内核,编译可以生成不同格式的映像文件,例如:
# make zImage

# make uImage

# make bzImage

zImage是ARM Linux常用的一种压缩映像文件。zImage是ARM Linux常用的一种压缩映像文件不能超过512KB,bzImage 即bigzImage ,二者的内核都是gzip压缩的。uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。
2.内核的链接地址:真正的内核链接地址。使用uInage时,要减去头部。
3.bootloader的链接地址
4.标记tag的地址。地址会作为参数传递给内核。tag的放置方法,可以参考 uboot ,必须以 ATAG_CORE 类型的开头,以 ATAG_NONE 类型的结尾。
5.启动内核时传递给内核的参数,3个,第一个默认0,第三个是前边提到的 tag 的地址,第二个是机器ID。内核中所有支持的“机器”或者称作开发板、单板都用一个 MACHINE_START 宏来定义,这个宏的作用就是填充一个 machine_desc 类型的结构体,填充的过程中会对它的 .nr 成员赋值,这个 nr 就是所谓的机器ID。
bootloader需要初始化串口,否则看不到内核打印信息。


你可能感兴趣的:(Bootloader,Jz2440,Arm,&,Asm)