参数的地址约定好后,还要规定参数的结构,以标记列表(tagged list)的形式来传递启动参数。标记,就是一种数据结构;标记列表,就是挨着存放的多个标记。标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束
标记的数据结构为tag,它由一个tag_header结构和一个联合(union)组成,tag_header表示标记的类型及长度,其定义在“include/asm-arm/setup.h”中


以设置内存标记、命令行标记为例说明参数的传递
(1)设置标记ATAG_CORE
假设Bootloader与内核约定的参数存放地址为0x30000100,则ATAG_CORE可以如下设置
params = (struct tag *)0x30000100;
params->hdr.tag = ATAG_CORE; //标记类型
params->hdr.size = tag_size(tag_core); //标记长度
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next(params); //tag_next指向当前标记的结尾
(2)设置内存标记
假设开发板使用的内存起始地址为0x30000000,大小为0x4000000,则内存标记可以如下设置
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size(tag_mem32);
params->u.mem.start = 0x30000000;
params->u.mem.size = 0x4000000;
params = tag_next(params);
(3)设置命令行标记
命令行就是一个字符串,它被用来控制内核的一些行为,如“root= /dev/mtdblock 2 init=/linuxrc console=ttySAC0”表示根文件系统在MTD2分区上,系统启动后执行的第一个程序为/linuxrc,控制台为ttySAC0
命令行可以在Bootloader中通过命令设置好,然后传递给内核
char *p = “root= /dev/mtdblock 2 init=/linuxrc console=ttySAC0”
params->hdr.tag = ATAG_CMDLINE;
params->hdr.size = (sizeof(struct tag_header+strlen(p)+1+4))>>2;
strcpy(params->u.cmdline.cmdline, p);
params = tag_next(params);
(4)设置标记ATAG_NONE
标记列表以标记ATAG_NONE结束,如下设置:
params->hdr.tag = ATAG_NONE;
params->hdr.size = 0;
PS:第三步设置命令行标记,也可以在配置LINUX时设定,执行 #make menuconfig后在“Boot Option”的第三行输入命令