UBOOT传递内核参数及机器码问题 下载本文

内容发布更新时间 : 2024/5/19 0:37:04星期一 下面是文章的全部内容请认真阅读。

UBOOT传递内核参数及机器码问题

1.内核参数传递

内核中的参数是内核提供的,在配置内核时指定,而u-boot提供的则在u-boot启动时传递到内核取代内核提供的。u-boot的参数传递利用了三个通用寄存器R0,R1,R2。u-boot在启动的过程中把参数放到3个寄存器中,到内核启动时再把寄存器中的参数取出。一般我们需要通过u-boot/tools/目录下的mkimage制作uImage,使用bootm命令进行加载,注意go命令是不传递内核参数的。

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image 选项:

-A:set architecture to 'arch' //用于指定CPU类型,比如ARM

-O:set operating system to 'os' //用于指定操作系统,比如Linux

-T:set image type to 'type' //用于指定image类型,比如Kernel

-C:set compression type 'comp' //指定压缩类型 -a:set load address to 'addr' (hex) //指定image的载入地址

-e:set entry point to 'ep' (hex) //内核的入口地址,一般为image的载入地址+0x40(信息头的大小)

-n:set image name to 'name' //image在头结构中的命名

-d:use image data from 'datafile' //无头信息的image文件名

-x:set XIP (execute in place) //设置执行位置 例如:

mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img

注意内核的加载地址是内存的起始地址+0x8000,0x40是64k的头部,是mkimage加上去的,0x30008040是内核第一条指令所在的地址。u-boot参数链表在内存中的地址是0x30000100。r0的值是0,r1是u-boot传递过来的机器码,r2是参数链表在内存中的物理地址。 修改u-boot中我们的开发板的配置文件

/include/configs/TE2440II.h,增加如下宏定义,使其能向内核传递参数(在这里主要是console参数,否则无法在控制台看到启动信息):

#define CONFIG_SETUP_MEMORY_TAGS #define CONFIG_INITRD_TAG

#define CONFIG_CMDLINE_TAG

#define CONFIG_BOOTARGS \

root=/dev/mtdblock3 init=/linuxrc mem=64M devfs=mount console=tty0 console=ttySAC0,115200\

上面的操作完成后,重新编译u-boot,下载到nand中,重新启动u-boot后,把我们编译生成的uImage文件下载到内存的0x30008000地址处,就可以用bootm命令来手动引导内核了(执行bootm 0x30008000)。 2.机器码

内核会在编译链接过程中,将各种处理器内核描述符组合成表,接着从机器描述符表中查询有无r1寄存器指定的机器码,如果没有就将退出,所以这也说明了为什么在u-boot中机器码一定要和内核中的机器码一致,否则内核就无法启动。 先看看u-boot的机器码和linux的机器码是由什么地方决定的,u-boot中的机器码在u-boot的

board/samsung/TE2440II/TE2440II.c中决定。 /* arch number of SMDK2410-Board */ gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

查看u-boot/include/asm-arm/mach-type.h文件有: #define MACH_TYPE_SMDK2410 193 #define MACH_TYPE_S3C2440 362