params = (struct tag *)0x0C000100;
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size(tag_core);
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next(params);
&
nbsp;
params->hdr.tag = ATAG_NONE;
params->hdr.size = 0;
对应地,在Linux内核源码arch/armnommu/mach-s3c44b0/arch.c中设置内核启动参数在RAM中的基地址:
MACHINE_START (S3C44B0, "44B0")
BOOT_PARAMS (0x0C000100)
MACHINE_END
4.调用uClinux Kernel
Bootloader调用Kernel的方法是直接跳转到其第一条指令处。对于ARM处理器,在跳转时应当满足下列条件:r0=0;r1=Machine ID;禁止IRQ和FIQ;处理器运行在Supervisor模式;关闭MMU;关闭Data Cache。
对于S3C44B0X,它没有MMU,其Cache是指令与数据合一的,因此只能全部关闭。各种ARM处理器的Machine ID均由www.arm.linux.org.uk分配;S3C44B0X的Machine ID是178。据此,用C代码实现的Kernel调用示例如下,其中r0和r1的值通过参数传递:
void (*CallKernel)(int zero, int mach) = (void (*)(int, int))KERNEL_ADDR;
CallKernel(0, 178);
5. 辅助功能 完整的Bootloader还应该允许更新Flash中存放的uClinux Kernel Image以及Bootloader自身。为此,必要的辅助功能包括:从主机下载文件到
目标板的RAM;用RAM中的数据烧写Flash;以及实现上述操作所需的人机交互接口,这里就不赘述了。
参考文献:
[1] 李善平,刘文峰等,Linux与嵌入式系统,清华大学出版社,2003年1月
[2] 詹荣开,嵌入式系统Boot Loader技术内幕,2003年12月
[3] ARM Architecture Reference Manual, ARM, 2000
[4] S3C44B0X RISC Microprocessor User's Manual, Samsung, 2002