uboot以tag方式给内核传参

2023-11-13

1、tag方式传参

(1)struct tag,tag是一个数据结构,在uboot和linux kernel中都有定义tag数据机构,而且定义是一样的。
(2)tag_header和tag_xxx。tag_header中有这个tag的size和类型编码,kernel拿到一个tag后先分析tag_header得到tag的类型和大小,然后将tag中剩余部分当作一个tag_xxx来处理。
(3)tag_start与tag_end。kernel接收到的传参是若干个tag构成的,这些tag由ATAG_CORE类型的tag起始,到ATAG_NONE类型的tag结束。
(4)tag传参的方式是由linux kernel发明的,kernel定义了这种向我传参的方式,uboot只是实现了这种传参方式从而可以支持给kernel传参。

2、内核如何接收tag参数

启动内核的代码:theKernel (0, machid, bd->bi_boot_params);其中bd->bi_boot_params就是所有tag结构体所在的首地址,这个地址是保存在全局变量gd->bd中的,在uboot启动的前期会指定内存地址用于存放tag结构体,然后在启动内核的时候传给内核,内核拿到地址就会从该地址去遍历tag结构体,内核会判断tag的类型,如果是ATAG_CORE类型的tag则是起始的tag,如果是ATAG_NONE则是最后一个tag结构体,不用再往后遍历。

3、tag结构体

struct tag_header {
		u32 size;	//结构体的大小
		u32 tag;	//结构体的类型
	};

struct tag {
       struct tag_header hdr;
		union { 	//此枚举体包含了uboot传给内核参数的所有类型
				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;
				
				struct tag_mtdpart      mtdpart_info;
		} u;
};

4、构建tag结构体

	/* The list must start with an ATAG_CORE node */
	#define ATAG_CORE	0x54410001
	
	/* The list ends with an ATAG_NONE node. */
	#define ATAG_NONE	0x00000000
	
	#define tag_size(type)	((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
	#define tag_next(t)	((struct tag *)((u32 *)(t) + (t)->hdr.size))
	
	static struct tag *params;
	
	static void setup_start_tag (bd_t *bd)
	{
		params = (struct tag *) bd->bi_boot_params;//bd->bi_boot_params是专门用于保存tag结构体的内存首地址

		params->hdr.tag = ATAG_CORE;	//ATAG_CORE类型是tag结构体的开始
		params->hdr.size = tag_size (tag_core);	//结构体的大小

		params->u.core.flags = 0;
		params->u.core.pagesize = 0;
		params->u.core.rootdev = 0;

		params = tag_next (params);	//将指针偏移params->hdr.size个字节,让params指向下一个可用的内存地址
	}
	
	`````````中间省略掉其他类型tag结构体的构建
	
	static void setup_end_tag (bd_t *bd)
	{
		params->hdr.tag = ATAG_NONE;
		params->hdr.size = 0;
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uboot以tag方式给内核传参 的相关文章

  • 高合汽车旗下可进化超跑SUV高合HiPhi X亮相海口国际新能源车展

    2021年1月8日 高端新能源智能出行品牌高合汽车旗下高合HiPhi X亮相第三届海口国际新能源汽车展览会 华人运通高合汽车创始人丁磊在现场透露 上市至今高合HiPhi X限量3000辆创始版车型即将预订售罄 累计收获了32000多位留资用
  • linux支持usb打印机

    配置CONFIG USB PRINTER y inux内核默认运行打印机 核 驱动 直接在配置上CONFIG USB PRINTER y添加上去就好了 make menuconfig 选上USB打印机选项 Device Drivers gt
  • s5p4418的uboot网络无法使用问题解决

    一 前言 s5p4418 是一个三星的基于ARM的 cortex A9的四核处理器 这个 处理器目前常用的两个系统层固件分别是 uboot2014 linux3 4 39 和 uboot2016 linux4 4 172 两个版本 本次针对
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • 一文讲透!Windows内核 & x86中断机制详解

    搞内核研究的经常对中断这个概念肯定不陌生 经常我们会接触很多与中断相关的术语 按照软件和硬件进行分类 硬件CPU相关 IRQ IDT cli sti 软件操作系统相关 APC DPC IRQL 一直以来对中断这一部分内容弄的一知半解 操作系
  • 自定义busybox文件系统存在的问题

    1 串口终端看不到命令行入口 只能在显示器端HDMI 看到 2 内核默认无法加载除了busybox openwrt文件系统 debian ubuntu无法加载
  • 如何获取嵌入式设备的内核版本信息

    1 有源码时 VERSION 2 PATCHLEVEL 6 SUBLEVEL 35 EXTRAVERSION 7 NAME Yokohama 如果你有内核的源码 可以在内核顶层的Makefile中找到版本号 上面的代码就是从内核的顶层Mak
  • linux内核之无锁缓冲队列kfifo原理(结合项目实践)

    无锁缓冲队列kfifo 1 kfifo概述 2 kfifo功能描述 3 kfifo put与 kfifo get详解 4 kfifo get和kfifo put无锁并发操作 5 总结 6 项目使用介绍 7 其它 userspace 移植实现
  • sel4白皮书翻译

    首发地址 http trialley top pages 53ac44 CSDN地址 https blog csdn net lgfx21 article details 117606097 翻译与转发许可 作者 Gernot Heiser
  • 海思3559:uboot顶层Makefile分析

    顶层Makefile的内容主要结构为 确定版本号及主机信息 实现静默编译功能 设置各种路径 设置编译工具链 设置规则 设置与cpu相关的伪目标 需要注意的是 结构顺序并不代表代码执行顺序 1 确定版本号及主机信息 VERSION 2016
  • 字符设备驱动相关函数

    Linux内核中 a 使用cdev结构体来描述字符设备 b 通过其成员dev t来定义设备号 分为主 次设备号 以确定字符设备的唯一性 c 通过其成员file operations来定义字符设备驱动提供给VFS的接口函数 如常见的open
  • 嵌入式Linux构建yaffs根文件系统

    嵌入式Linux构建yaffs根文件系统 开发环境说明 ubuntu1404 i686 天嵌光盘里的交叉编译链 版本4 4 3 busybox 1 13 0 下载地址 https busybox net downloads 一 编译busy
  • nmap操作系统检测_Nmap操作系统检测

    nmap操作系统检测 rps include post 6632 rps include post 6632 One of the most popular feature of nmap is its Operating System d
  • 【Linux】向Linux 5.11.8内核加入新的系统调用

    目录 特殊声明 A mathcal A A 获取root权限
  • printk()和printf()的比较

    1 前言 print函数和printf函数是对孪生兄弟 在功能作用上几乎是一样的 在使用上有一些区别 1 printk 和printf 之间的一个显著区别在于printk 允许通过指定一个标志来设置优先级 从而决定这条打印是否需要打印出来
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 如何从u-boot启动Linux内核?

    我的 Linux 内核镜像uImage在我的U盘里 我想从 U Boot 启动它 还有设备树文件am335x evm dtb在我的U盘里 我所做的如下 U Boot usb start Re start USB USB0 scanning
  • 嵌入式linux ARM启动地址

    我按照一些文档通过 sdcard 在 ARM 板 例如 Freescale Vybrid tower 上启动嵌入式 Linux 在文档中 有构建 uImage 并将 u boot 写入 sdcard 的步骤 如下所示 sudo dd if
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin

随机推荐

  • 【标准化方法】(3) Group Normalization 原理解析、代码复现,附Pytorch代码

    今天和各位分享一下深度学习中常用的标准化方法 Group Normalization 数据分组归一化 向大家介绍一下数学原理 并用 Pytorch 复现 Group Normalization 论文地址 https arxiv org pd
  • 关于STM32单片机的I/O口配置

    最近在看数据手册的时候 发现在Cortex M3里 对于GPIO的配置种类有8种之多 1 GPIO Mode AIN 模拟输入 2 GPIO Mode IN FLOATING 浮空输入 3 GPIO Mode IPD 下拉输入 4 GPIO
  • CString转char[]在unicode下几种方法

    在 Unicode 编码下 将 CString 转换为 char 类型有多种方法 以下是其中的几种 方法一 使用 CString 的 GetBuffer 方法 可以使用 CString 的 GetBuffer 方法获取字符指针 然后将指针转
  • 6、类和对象作业

    类和对象作业 一 填空题 1 类是组成Java程序的基本要素 类体有两部分构成 一部分是变量的定义 另一部分是 的定义 2 执行Person p new Person 语句后 将在 中给Person对象分配空间 并在栈内存中给引用变量p分配
  • LateX数学公式

    文章目录 一 希腊字母 1 小写希腊字母 2 大写希腊字母 3 全部希腊字母表 二 上下标 1 上下标是一个字符 2 上下标多于一个字符 3 不同的英文字母 1 i表示变量 2 i表示输入 3 补充 4 常量字母 三 分式与根式 1 分式
  • kaggle通过API下载数据集主要事项及指定路径保存

    每次下载新的数据集都需要重新操作接受规则 Rules gt 下载 json 文件 gt 将新的 json 文件放入到 kaggle 文件夹中 否则下载时 会出现错误 更改默认下载地址 kaggle config set n path v l
  • 双快门锁教程_双快功能的锁体的制作方法

    本发明属于一种双快功能的锁体 背景技术 我们知道 不管是机械式锁体 还是电子式锁体 往往都设有斜舌组件 方舌组件 天地销 联动板等 人们在门内 外操作执手或钥匙来斜舌组件 方舌组件推出去锁门或拉回来缩回到壳体内来开门的同时 通过联动板来将天
  • 计算机网络课好难啊,【知乎】计算机网络这门课为何如此之难

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 操作系统和计算机网络的共同点 在于它们都是相当复杂的体系结构 如果觉得难 也许是因为自己没能产生足够的求知欲 你也说了 无聊 晦涩 而无聊感其实是没治的 对课程的热情和对女生的爱慕感其实差不多
  • 字节秋招二面把我干懵了,问我SYN报文什么情况下会被丢弃?

    大家好 我是小林 之前有个读者在秋招面试的时候 被问了这么一个问题 SYN 报文什么情况下会被丢弃 好家伙 现在面试都问那么细节了吗 不过话说回来 这个问题跟工作上也是有关系的 因为我就在工作中碰到这么奇怪的问题 客户端向服务端发起了连接
  • MCU烧录方式有什么区别?

    1 MCU程序烧录方式 最近刚好接触到MCU烧录这一块的东西 综合以前学的一些零散的和目前掌握的相关资料 主要有以下几种相关的方式 ISP IAP以及ICP 它们都是对MCU进行编程 但具体的方式有所不同 下面详细了解下每个编程方式的特点
  • 二级C语言选择题练习附答案

    1 下列叙述中正确的是 A 所谓算法就是计算方法 B 程序可以作为算法的一种描述方法 C 算法设计只需考虑得到计算结果 D 算法设计可以忽略算法的运算时间 答案 B 解析 算法是指对解题方案的准确而完整的描述 算法不等于数学上的计算方法 也
  • 【Java】包package的概念和理解以及访问权限

    Java 包 package 为了更好地组织类 Java 提供了包机制 用于区别类名的命名空间 如何创建包 创建包的时候 你需要为这个包取一个合适的名字 之后 如果其他的一个源文件包含了这个包提供的类 接口 枚举或者注释类型的时候 都必须将
  • 字节实习接触到的数据库简单总结

    文章目录 一 Hive 二 ClickHouse 三 Abase 一 Hive Hive 由 Facebook 实现并开源 是基于 Hadoop 的一个数据仓库工具 可以将结构化的数据映射为一张数据库表 并提供 HQL Hive SQL 查
  • 计算机软考设计师中级真题

    计算机软考设计师中级真题分享 软考 以考代评 软考有着掌握知识 get技能的作用 职称评定 升职加薪 户籍加分 扎根落户的作用 软件设计师 适合做开发的朋友 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求 按照系统总体设计规格说
  • 连续退火曲线的时空转换

    退火曲线的时空转换 应用场景是连续退火工艺过程 目的是将一个批次 即一块带钢 分解为若干个小带钢段 通过下述时空转换算法画出每个小带钢段的退火曲线 然后放在一起进行一些分析工作 例如profile方法 functional方法等等 参数设置
  • Go语言性能分析

    一 benchmark基准测试 1 性能分析 Go语言优化代码的过程中 需要评估代码的性能如何 Go标准库内置的testing测试框架提供了基准测试 benchmark 工具 可以很容易地对某一段代码进行性能测试 2 快速开始 1 初始化模
  • antd UpLoad 的 Dragger 加 ImgCrop 实现自定义上传及剪切

    前言本次封装的组件主要应用于自定义上传 上传过程中组件只用于展示图片 获取图片的obj转为base64return到组件外部在需要调接口时进行参数上传 1 使用 Dragger 需要 const Dragger Upload 2 组件部分
  • Python学习第十一天——re

    re 正则表达式 正则就是用一些具有特殊含义的符号组合到一起 称为正则表达式 来描述字符或者字符串的方法 或者说 正则就是用来描述一类事物的规则 在Python中 它内嵌在Python中 并通过 re 模块实现 正则表达式模式被编译成一系列
  • sql 列求和_SQL 中文笔记 aggregation

    SQL for Data Analysis课程笔记 来源于Udacity 是我上课所记 顺便分享出来便于不方便看视频课程的小伙伴参考 其次如果有错误的部分 还望大家指正 谢谢 Aggregate 聚集 Count 某特定列有多少行 Sum
  • uboot以tag方式给内核传参

    1 tag方式传参 1 struct tag tag是一个数据结构 在uboot和linux kernel中都有定义tag数据机构 而且定义是一样的 2 tag header和tag xxx tag header中有这个tag的size和类