Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225211
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-07 14:39:04

bootm 命令讲起

 

1 找到linux的内核入口

Bootm命令通过读取uImage的头部0x40字节的信息,将uImage定位到正确的地址,同时找到linux的内核入口地址。

这个地方就涉及到uImage的头部0x40字节信息到底是什么的问题?uboot提供了mkimage命令去把0x40字节加在linux内核头部。

 mkimage -n "Kernel 2.4.18" -A arm -O linux -T kernel -C none -a 30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img

       -a 30007fc0,内核的拷贝地址。

    -e 30008000,内核的入口地址。

       -C 是否对内核压缩

 

2 linux内核传递参数

if ((s = getenv("bootargs")) == NULL)

              s = "";

 

       strcpy (cmdline, s);

 

       cmd_start    = (ulong)&cmdline[0];

       cmd_end      = cmd_start + strlen(cmdline);

读取bootargs,保存在cmdline字符数组中,并用cmd_start指向cmdline开始处,用cmd_end指向cmdline末尾。

 

/*

        * Linux Kernel Parameters:

        *   r3: ptr to board info data

        *   r4: initrd_start or 0 if no initrd

        *   r5: initrd_end - unused if r4 is 0

        *   r6: Start of command line string

        *   r7: End   of command line string

        */

       (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);

注意,除了我一直想知道的bootargs,另外还向kernel传递了kbdinitrd_startinitrd_end三个参数。

Kbd,使用bd_t结构定义,向内核传递很多board信息;

这些信息的来源就是uboot所维系的bd结构中的信息;

Initrd_startinitrd_end应该是告诉内核ramdisk的位置在哪里;

Ramdisk的信息目前我看到了两种方法:

1)  ramdisk和内核做成一个multiImagebootm函数及do_boot_linux会根据multiImage自己去找ramdiskram中的位置。然后传递给内核。

2)  Ramdisk和内核分开,是两个image,然后分别下载到ram中,此时ramdisk的位置可以通过bootargs传递给内核。

阅读(1578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~