码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2015-04-22 20:00:22      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

?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)

?

?

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

标签:

原文地址:http://www.cnblogs.com/embedded-tzp/p/4448151.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!