【linux】U-BOOT与linux kernel通信: struct tag

?u-boot与linux通信格式

?

技术分享

?

如上图,开机时执行u-boot, u-boot引导完后,就是交给linux系统了,但是linux需要一些基本信息,如内存大小,启动方式等,这就涉及到u-boot和linux通信。

而通信格式由linux规定了,以其中atag格式举例,详情查阅Documentation/arm/Setup

?

格式结构体为struct tag: 定义在 Setup.h (src\arch\arm\include\uapi\asm):147

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;

?

/*

* Acorn specific

*/

struct tag_acorn acorn;

?

/*

* DC21285 specific

*/

struct tag_memclk memclk;

} u;

};

?

?

技术分享

u-boot会按照上述格式,在内存中划分一块atag参数区域,对该区域进行赋值。此处不对u-boot做讨论,后面在专门写文章。当赋值完成后,将cpu初始化成 MMU = off, D-cache = off, I-cache = dont care, r0 = 0, r1 = machine nr, r2 = atags or dtb pointer,跳转到linux代码起始处。

?

Linux atag参数解析流程

Linux代码执行后,在第一阶段(start_kernel函数之前),会验证该区域正确性(bl __vet_atags)。

进入第二阶段后(start_kernel函数之后):会开始真正解析atag参数,并赋值给相应的变量。流程:start_kernel setup_arch→setup_machine_tags→parse_tags→parse_tag

?

Init.h (src\include\linux) :中定义了大部分的 section,比较重要的有

#define __init __section(.init.text) __cold notrace

#define __initdata __section(.init.data)

#define __initconst __constsection(.init.rodata)

#define __exitdata __section(.exit.data)

#define __exit_call __used __section(.exitcall.exit)

?

?

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。