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

相关文章
|
2月前
|
C语言
内核源码中遇到不会解析的宏怎么办?
内核源码中遇到不会解析的宏怎么办?
204 1
|
1月前
|
Linux C语言 Android开发
uboot介绍:介绍uboot的基本概念、用法和实现方式
uboot介绍:介绍uboot的基本概念、用法和实现方式
44 0
|
3月前
|
存储 安全 Linux
Linux sync 指令的作用
Linux sync 命令的作用是确保所有未写入磁盘的数据被立即同步至物理存储介质上,以保护文件系统的一致性和防止意外关机时的数据丢失。虽然 sync 在日常交互式使用中可能不常直接调用,但许多高级操作或脚本中会包含此命令来保证数据安全。
77 0
|
18天前
|
存储 安全 Linux
Linux 内核启动流程与入口函数分析
Linux 内核启动流程与入口函数分析
87 0
|
9月前
|
Linux C语言 数据安全/隐私保护
驱动模块传参
驱动模块传参
58 0
|
11月前
|
存储 Linux C语言
Linux 内核常见的宏(1):offsetof 和 container_of分析
Linux 内核常见的宏(1):offsetof 和 container_of分析
156 0
Linux 内核常见的宏(1):offsetof 和 container_of分析
|
Linux
LINUX加载静态库so,取得函数地址并调用
LINUX加载静态库so,取得函数地址并调用
278 0
|
Linux 测试技术
linux内核探索--系统调用(传参)
linux内核探索--系统调用(传参)
135 0
linux内核探索--系统调用(传参)
|
存储
驱动开发:内核枚举LoadImage映像回调
在笔者之前的文章`《驱动开发:内核特征码搜索函数封装》`中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核`LoadImage`映像回调,在Win64环境下我们可以设置一个`LoadImage`映像加载通告回调,当有新驱动或者DLL被加载时,回调函数就会被调用从而执行我们自己的回调例程,映像回调也存储在数组里,枚举时从数组中读取值之后,需要进行位运算解密得到地址。
268 1
驱动开发:内核枚举LoadImage映像回调
|
弹性计算 Linux
查看和修改Linux实例内核参数
查看和修改Linux实例内核参数
893 0