bootloader用atag向kernel传递信息:
atag的info可以在 rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> include/asm-arm/setup.h 找到:
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 参数链表必须以ATAG_CORE 开始,以ATAG_NONE 结束。这里的ATAG_CORE,ATAG_NONE 是各个参数的标记,本身是一个32 位值,例如:ATAG_CORE=0x54410001。
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 其它的参数标记还包括: ATAG_MEM32 , ATAG_INITRD , ATAG_RAMDISK ,ATAG_COMDLINE 等。每个参数标记就代表一个参数结构体,由各个参数结构体构成了参数链表。参数结构体的定义如下:
struct tag
{
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_acorn acorn;
struct tag_memclk memclk;
} u;
};
参数结构体包括两个部分,一个是 tag_header 结构体,一个是u 联合体。
tag_header 结构体的定义如下:
struct tag_header
{
u32 size;
u32 tag;
};
其中 size:表示整个tag 结构体的大小(用字的个数来表示,而不是字节的个数),等于tag_header 的大小加上u 联合体的大小,例如,参数结构体ATAG_CORE 的 rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> size= (sizeof(tag->tag_header)+sizeof(tag->u.core))>>2 ,一般通过函数 tag_size(struct * tag_xxx)来获得每个参数结构体的size。其中tag:表示整个tag 结构体的标记,如:ATAG_CORE等。
eg:
static struct init_tags {
struct tag_header hdr1;//一个header
struct tag_core core; //一个内容
struct tag_header hdr2;
struct tag_cmdline cmdline;
struct tag_header hdr3; //结束的,不需要内容
} init_tags = {
{ tag_size(tag_core), ATAG_CORE },
{ 1, PAGE_SIZE, 0xff },
{ tag_size(tag_cmdline), ATAG_CMDLINE },
{ "" },
{ 0, ATAG_NONE }
};
tool:
build a atag include a command line: Makefile update_atag.sh gen_cmdline.c
atag的info可以在 rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> include/asm-arm/setup.h 找到:
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 参数链表必须以ATAG_CORE 开始,以ATAG_NONE 结束。这里的ATAG_CORE,ATAG_NONE 是各个参数的标记,本身是一个32 位值,例如:ATAG_CORE=0x54410001。
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 其它的参数标记还包括: ATAG_MEM32 , ATAG_INITRD , ATAG_RAMDISK ,ATAG_COMDLINE 等。每个参数标记就代表一个参数结构体,由各个参数结构体构成了参数链表。参数结构体的定义如下:
struct tag
{
struct tag_header hdr;
union {
struct tag_core core;
struct tag_mem32 mem;
struct tag_videotext videotext;
struct tag_ramdisk ramdisk;
struct tag_initrd initrd;
struct tag_serialnr serialnr;
struct tag_revision revision;
struct tag_videolfb videolfb;
struct tag_cmdline cmdline;
struct tag_acorn acorn;
struct tag_memclk memclk;
} u;
};
参数结构体包括两个部分,一个是 tag_header 结构体,一个是u 联合体。
tag_header 结构体的定义如下:
struct tag_header
{
u32 size;
u32 tag;
};
其中 size:表示整个tag 结构体的大小(用字的个数来表示,而不是字节的个数),等于tag_header 的大小加上u 联合体的大小,例如,参数结构体ATAG_CORE 的 rel="File-List" href="file:///C:%5CDOCUME%7E1%5CCindy%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> size= (sizeof(tag->tag_header)+sizeof(tag->u.core))>>2 ,一般通过函数 tag_size(struct * tag_xxx)来获得每个参数结构体的size。其中tag:表示整个tag 结构体的标记,如:ATAG_CORE等。
eg:
static struct init_tags {
struct tag_header hdr1;//一个header
struct tag_core core; //一个内容
struct tag_header hdr2;
struct tag_cmdline cmdline;
struct tag_header hdr3; //结束的,不需要内容
} init_tags = {
{ tag_size(tag_core), ATAG_CORE },
{ 1, PAGE_SIZE, 0xff },
{ tag_size(tag_cmdline), ATAG_CMDLINE },
{ "" },
{ 0, ATAG_NONE }
};
tool:
build a atag include a command line: Makefile update_atag.sh gen_cmdline.c