Chinaunix首页 | 论坛 | 博客
  • 博客访问: 396931
  • 博文数量: 115
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 1009
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 17:05
文章分类

全部博文(115)

文章存档

2011年(2)

2010年(86)

2009年(27)

我的朋友

分类: 嵌入式

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工作模式

必须禁止中断(IRQFIQ)

CPU必须为SVC模式

(3)CacheMMU的设置

MMU必须关闭

指令Cache可以打开也可以关闭

数据Cache必须关闭

阅读(785) | 评论(0) | 转发(0) |
0

上一篇:Bootm的流程分析

下一篇:official Squashfs LZMA

给主人留下些什么吧!~~