bootloader与linux之间传参数

来源:互联网 发布:云服务器设计软件 编辑:程序博客网 时间:2024/06/09 17:34

2        ATAGS参数传递

2.1    结构图

 

 

2.2    数据结构

数据结构:

struct tag {

       structtag_header hdr;

       union{

              structtag_core              core;

              structtag_mem32   mem;

              structtag_videotext       videotext;

              structtag_ramdisk  ramdisk;

              structtag_initrd      initrd;

              structtag_serialnr   serialnr;

              structtag_revision  revision;

              structtag_videolfb  videolfb;

              structtag_cmdline  cmdline;

/* Acorn specific */

              structtag_acorn      acorn;

              /** DC21285 specific */

              structtag_memclk  memclk;

       }u;

};

struct tag_header {
    __u32 size;
    __u32 tag;
} ;

 

 

2.3    说明

●Taglist 用来在 bootloader和 linux kernel之间传递参数

●Taglist地址由bootloader指定

●由bootloader负责填充Tag list列表内容

通过 Tag size 以及当前tag 的位置来定位下一个 tag的位置

●数据结构在bootloader和linux中有完全一致的定义

●引导linux时,bootloader将Tag list地址指针传递给linux(传给linux的参数共3个,分别是0,machid,Tag list指针)

 

2.4    linux tag取值

# defineATAG_CORE          0x54410001
# define ATAG_MEM           0x54410002
# define ATAG_VIDEOTEXT       0x54410003
# define ATAG_RAMDISK          0x54410004
# defineATAG_INITRD               0x54410005
# define ATAG_INITRD2             0x54420005
# define ATAG_SERIAL              0x54410006
# define ATAG_REVISION   0x54410007
# define ATAG_VIDEOLFB  0x54410008
# define ATAG_CMDLINE           0x54410009
# define ATAG_ACORN              0x41000101
# define ATAG_MEMCLK           0x41000402

 

2.5    Tag list的解析

linux的解析列表存放在.taglist.init固定段中

●每一项taglist的解析通过调用__tagtable( tag, fn)宏定义的方式给出

每个tag table的表项就自动连接在了一起,而且存在于同一个段中

kernel中,将针对tag list中的每一项,在这个tag parser list中进行查找,如果有对应的处理项,则调用解析函数,于是就完成了参数的传递以及解析!

●可扩展,ATAG_宏定义和__tagtable( tag, fn)实现可以添加,bootloader需要增加对应的ATAG_宏定义和taglist内容

 

struct tagtable {
    __u32 tag;
    int ( * parse) ( const struct tag * ) ;
} ;
# define __tag __used __attribute__( ( __section__( ".taglist.init" )) )
# define __tagtable( tag, fn) /
static struct tagtable __tagtable_# # fn __tag = { tag, fn }

 

目前linux核心定义的ATAG解析项:

__tagtable( ATAG_CORE, parse_tag_core) ;
__tagtable( ATAG_MEM, parse_tag_mem32) ;
__tagtable( ATAG_VIDEOTEXT, parse_tag_videotext) ;
__tagtable( ATAG_RAMDISK, parse_tag_ramdisk) ;
__tagtable( ATAG_SERIAL, parse_tag_serialnr) ;
__tagtable( ATAG_REVISION, parse_tag_revision) ;
__tagtable( ATAG_CMDLINE, parse_tag_cmdline) ;

 


 

 

0 0
原创粉丝点击