uboot移植之tag传参

简介:

1:什么是tag

(1)tag是一种数据结构,用于uboot向内核传递参数,一个tag代表了一个参数,uboot在向kernel传参时,就是通过一个个tag来实现的。

(2)每个tag都有一个tag_header(一个结构体),包含了tag的类型和大小,然后tag中剩余的部分tag_xxx来当作传参的tag


2:kernel如何知道tag的起始地址。

uboot启动内核的最后通过theKernel (0, machid, bd->bi_boot_params);来启动内核,这三个参数,第一个固定是0,;第二个是机器码;第三个就是tag的存放的起始地址,也就是setup_start_tag。这三个参数分别存放在寄存器r0 r1 r2中。


3:kernel如何知道tag的结束地址

在tag传参的过程中,有一个setup_start_tag(ATAG_CORE类型)和setup_end_tag (ATAG_NONE类型),setup_start_tag表示tag开始传参,setup_end_tag 表示传参的结束,这两个tag之间的tag就是实际的向内核传递的tag。

总结:uboot和kernel都是在DDR中运行的,uboot先运行,最后通过theKernel (0, machid, bd->bi_boot_params);跳转到执行kernel,uboot向kernel传参的实现就是uboot和kernel规定一种传参的数据格式(tag),然后uboot将需要传递给kernel的参数存放到DDR的某段内存中,然后将 这段内存的起始地址传递给kernel,然后kernel通过这个地址来读取传递的参数。


在uboot的移植的时候需要注意的是

(1)tag传参部分的代码是不需要修改的,我们需要做的是需要打开或者关闭相应的宏定义,用来确定向内核传递哪些参数

(2)如果内核启动不成功,则需要考虑uboot传参是否正确。传参不成功首先看uboot中bootargs设置是否正确,其次看uboot是否开启了相应宏以支持传参。


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

相关文章
|
3月前
|
存储 缓存 编译器
【C深剖】详解变量与auto、register
【C深剖】详解变量与auto、register
|
JavaScript 前端开发 程序员
普通函数中的this指向问题解决方案call
普通函数中的this指向问题解决方案call
51 0
|
前端开发
|
JSON 数据格式
Beego---Beego传值和返回格式函数
Beego---Beego传值和返回格式函数
Beego---Beego传值和返回格式函数
SAP ABAP 方法调用里传值(Pass Value)和传引用(Pass Reference)的区别试读版
SAP ABAP 方法调用里传值(Pass Value)和传引用(Pass Reference)的区别试读版
|
JavaScript
2022前端面经---改变this指向问题(call、apply、bind)
2022前端面经---改变this指向问题(call、apply、bind)
|
JavaScript 前端开发
#yyds干货盘点# 【js学习笔记十七】普通函数中的this指向问题解决方案call
#yyds干货盘点# 【js学习笔记十七】普通函数中的this指向问题解决方案call
91 0
#yyds干货盘点# 【js学习笔记十七】普通函数中的this指向问题解决方案call
|
JavaScript
《跟热饭一起学习vue吧》Part.6 指令带参数和修饰符
《跟热饭一起学习vue吧》Part.6 指令带参数和修饰符