分类: 嵌入式
2010-11-09 22:30:20
U-Boot通过标记列表向内核传递启动参数,以下是bootm中的设置启动参数的代码:
#if defined (CONFIG_SETUP_MEMORY_TAGS) || \ defined (CONFIG_CMDLINE_TAG) || \ defined (CONFIG_INITRD_TAG) || \ defined (CONFIG_SERIAL_TAG) || \ defined (CONFIG_REVISION_TAG) || \ defined (CONFIG_LCD) || \ defined (CONFIG_VFD) setup_start_tag (bd); #ifdef CONFIG_SERIAL_TAG setup_serial_tag (¶ms); #endif #ifdef CONFIG_REVISION_TAG setup_revision_tag (¶ms); #endif #ifdef CONFIG_SETUP_MEMORY_TAGS setup_memory_tags (bd); #endif #ifdef CONFIG_CMDLINE_TAG setup_commandline_tag (bd, commandline); #endif #ifdef CONFIG_INITRD_TAG if (images->rd_start && images->rd_end) setup_initrd_tag (bd, images->rd_start, images->rd_end); #endif #if defined (CONFIG_VFD) || defined (CONFIG_LCD) setup_videolfb_tag ((gd_t *) gd); #endif setup_end_tag (bd); #endif |
如果要设置某个启动参数,在include/configs/mini2440.h中添加相应的宏定义,如:
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
对于ARM结构的CPU,是通过lib_arm/bootm.c中的do_bootm_linux函数来启动内核的,把控制权交给内核。
theKernel (0, machid, bd->bi_boot_params);
theKernel原型如下:
void (*theKernel)(int zero, int arch, uint params);
第一个参数为0,第二个参数表示不同的CPU架构,第三个参数参数标记列表的开始地址。theKernel指向内核存放的地址,对于ARM结构的CPU,通常是0x30008000,
调用内核之前,下列条件要满足:
(1)CPU寄存器设置
R0=0;
R1=及其类型ID;
R2=启动参数标记列表在RAM中的起始地址。
(2)CPU工作模式
必须禁止中断(IRQ和FIQ)
CPU必须为SVC模式
(3)Cache和MMU的设置
MMU必须关闭
指令Cache可以打开也可以关闭
数据Cache必须关闭