uboot给内核传参的方式——tag

简介:

一:tag是什么?

tag 是一个数据结构:stract tag  这种数据格式在uboot和kernel是一样的,也就是说uboot在启动的时候将需要传给kernel的参数放在了DDR的某个地址处,而存放格式就是tag格式,然后kernel就会到这个地址去读取这些参数,读取方式也是按tag格式去读取的。


简单来说tag就像是一个数组一样,是一块连续的内存,里面存放了uboot需要传递给kernel的参数信息,我们通过定义一个指针paramsstatic struct tag *params;),先使其指向tag的存放地址(30000100,uboot也就是说在30000100的地方存放了一条信息,告诉kernel去0x54410001这个地方去读取tag(也就是uboot传递给kernel的参数)



二:分析

(1)CONFIG_SETUP_MEMORY_TAGS:tag_mem,传参内容是内存的配置信息

(2)CONFIG_CMDLINE_TAG :tag_cmdline,传参内容是启动命令参数,也就是uboot环境变量bootargs

(3)CONFIG_INITRD_TAG

(4)CONFIG_MTDPARTITION:传参内容是iNand/SD卡的分区表

(5)起始tag是ATAG_CORE  结束tag是ATAG_NONE,其他的ATAG_xxx都是有效信息,传递着某些参数

params = (struct tag *) bd->bi_boot_params;这里的bi_boot_params为30000100),然后让params(远跳转)指向tag的开头(params->hdr.tag = ATAG_CORE;这里ATAG_CORE0x54410001),让其继续指向这个tag中的其他内容,并进行赋值,在这个tag的最后通过params = tag_next (params);将params指向下一个tag,所以当我们操作一个tag时不需要考虑这个时候内存(也就是params指向什么地方)


三:内核如何拿到这些tag信息??

uboot最终通过调用theKernel (0, machid, bd->bi_boot_params);函数来执行linux内核的,uboot调用这个函数(其实就是linux内核)时传递了三个参数。这三个参数就是uboot直接传递给linux内核,这3个参数是通过寄存器来实现的传参的,第一个参数就放在r0中,第二个参数(机器码)放在r1中,第三个参数放在r2中(第三个参数传递的就是tag的首地址这里是30000100)



本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1833740

相关文章
|
7月前
|
C语言
内核源码中遇到不会解析的宏怎么办?
内核源码中遇到不会解析的宏怎么办?
232 1
|
3月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
7月前
|
Linux C语言 Android开发
uboot介绍:介绍uboot的基本概念、用法和实现方式
uboot介绍:介绍uboot的基本概念、用法和实现方式
408 0
|
7月前
|
存储 安全 Linux
Linux 内核启动流程与入口函数分析
Linux 内核启动流程与入口函数分析
241 0
|
Linux C语言 数据安全/隐私保护
驱动模块传参
驱动模块传参
116 0
|
传感器 算法 Linux
media设备节点初始化与Video4Linux初始化
media设备节点初始化与Video4Linux初始化
213 0
|
Linux
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
通过sysfs文件系统接口来改变内核模块中的变量值(一)--通过fasync实现
101 0
|
Linux
LINUX加载静态库so,取得函数地址并调用
LINUX加载静态库so,取得函数地址并调用
324 0
|
Linux
Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息
Linux驱动开发 驱动程序的具体编写及出口入口函数解析,printk打印内核信息
242 0
|
NoSQL Linux 开发工具
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(二)
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析
218 0
Linux系统调用六、stat函数与 struct stat 文件信息结构体深度刨析(二)