|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于在linux中,用户权限很大,做任何事情都很自由,所以,你往往需要知道你做的每一步在干什么。
bootm0x1000000x240000
(个中:0x100000是linux内核在Flash中的地点,0x240000是initrd在flash中的地点)
setenvbootargsconsole=ttyS0,115200n8root=/dev/ramrwmem=32M
当u-boot利用下面的设置时,可以一般引诱linux加载initrd!
注重:
u-boot和linux内核之间是经由过程ATAG-TAG体例来传送启动参数的。u-boot依据上面的命令:
bootm0x1000000x240000
经由过程挪用setup_initrd_tag()在params=(structtag*)bd->bi_boot_params内存响应地位创建initd的TAG表项,向linux传送了关于initrd的内核参数,因而,不必在bootargs中再次指定initrd的相干参数了!
voiddo_bootm_linux(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[],
ulongaddr,ulong*len_ptr,intverify)
{
ulonginitrd_start,initrd_end;
......
data=addr+sizeof(image_header_t);
len=ntohl(hdr->ih_size);
......
#ifdefined(CONFIG_B2)||defined(CONFIG_OSK_OMAP5912)
memmove((void*)ntohl(hdr->ih_load),(uchar*)data,len);
data=ntohl(hdr->ih_load);
#endif
......
if(data){
initrd_start=data;
initrd_end=initrd_start+len;
}
......
#ifdefined(CONFIG_SETUP_MEMORY_TAGS)||
defined(CONFIG_CMDLINE_TAG)||
defined(CONFIG_INITRD_TAG)||
setup_start_tag(bd);
......
#ifdefCONFIG_INITRD_TAG
if(initrd_start&&initrd_end)
setup_initrd_tag(bd,initrd_start,initrd_end);
#endif
......
setup_end_tag(bd);
#endif
......
theKernel(0,bd->bi_arch_number,bd->bi_boot_params);
}
#ifdefCONFIG_INITRD_TAG
staticvoidsetup_initrd_tag(bd_t*bd,ulonginitrd_start,ulonginitrd_end)
{
params->hdr.tag=ATAG_INITRD2;
params->hdr.size=tag_size(tag_initrd);
params->u.initrd.start=initrd_start;
params->u.initrd.size=initrd_end-initrd_start;
params=tag_next(params);
}
#endif
#ifdefined(CONFIG_SETUP_MEMORY_TAGS)||
defined(CONFIG_CMDLINE_TAG)||
defined(CONFIG_INITRD_TAG)||
......
staticvoidsetup_start_tag(bd_t*bd)
{
params=(structtag*)bd->bi_boot_params;
......
params=tag_next(params);
}
intboard_init(void)
{
DECLARE_GLOBAL_DATA_PTR;
gd->bd->bi_arch_number=234;
gd->bd->bi_boot_params=0x10000100;
......
}
</p>
开发linux发行版的人都是通读过linux内核代码,对linux原理极其精通的人。 |
|