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