直接使用rtems的应用程序替换linux的内核,运行在nand flash上,需要修改u-boot的启动部分,
(源码/opt/EmbedSky/selinux/opt/EmbedSky/u-boot-1.1.6)
具体修改在boot_zImage.c中int boot_zImage(ulong from, size_t size)函数负责将linux的的镜像从nand flash 拷贝到内存,拷贝地址是0x30008000,而
rtems启动地址是0x30000000,因此修改如下:红色部分
int boot_zImage(ulong from, size_t size)
{
int ret;
ulong boot_mem_base; /* base address of bootable memory */
ulong to;
ulong mach_type;
boot_mem_base = 0x30000000;
/* copy kerne image */
//to = boot_mem_base + LINUX_KERNEL_OFFSET; //注释掉
to = boot_mem_base; //将地址直接设为0x30000000
//printf("Copy linux kernel from 0x%08lx to 0x%08lx, size = 0x%08lx ... ",
// from, to, size); //注释掉
printf("Copy rtems program from 0x%08lx to 0x%08lx, size = 0x%08lx ... ",
from, to, size); //打印信息,不重要
ret = copy_kernel_img(to, (char *)from, size);
if (ret) {
printf("failed\n");
return -1;
} else {
printf("Copy Kernel to SDRAM done,");
}
printf("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4));//打印信息,不重要
/*if (*(ulong *)(to + 9*4) != LINUX_ZIMAGE_MAGIC) {
printf("Warning: this binary is not compressed linux kernel image\n");
printf("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4));
} else {
// printf("zImage magic = 0x%08lx\n", *(ulong *)(to + 9*4));
;
}*/ //这一段注释掉
/* Setup linux parameters and linux command line */
//setup_linux_param(boot_mem_base + LINUX_PARAM_OFFSET); //注释掉
/* Get machine type */
mach_type = MACH_TYPE_S3C2440;
// printf("MACH_TYPE = %d\n", mach_type);
/* Go Go Go */
printf("NOW, Booting rtems......\n");
call_linux(0, mach_type, to);
return 0;
}