uboot修改linux源码中参数,将自定义参数从uboot传入kernel的并读取的方法【转】
希望朋友们多多指点,好的技术或心得一起分享:
uboot向kernel传参机制以及kernel如何解析cmdline参数大家可以参考其他前辈的博文,这方面的讲解十分详尽。
在这里我总结以下自己在uboot自定义一个参数并从kernel中取得的方法:
一.uboot添加自定义参数number
在uboot命令行下,我通过setenv bootargs以及saveenv命令来在bootargs参数中添加自己的一个参数,例如:
=>setenv bootargs xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx number=${num}
=>setenv num 0
=>saveenv
其中bootargs前面部分省略,number为在原bootargs后添加的参数,它会去取num的值,因此以后只要修改num的值即可(这里先设置为0)
二.kernel读取uboot传入的参数number:
在想要取得uboot传入参数的文件中进行如下操作:
1.添加头文件:
#include
2.添加如下内容:
static unsigned int number;
static int __init number_setup (char *num)
{
number = *num - '0';
}
__setup("number=", number_setup);
宏__setup("number=", number_setup)会在bootargs中取得"number="后的值作为函数number_setup的参数num,因此只要在number_setup函数中用全局变量number接收该值即可(此处我将传入的值作为数字处理)。
至此,我们就能在kernel中读取到uboot传入的自定义参数值
****************************************************************************************************************
另:作为用户来说,不可能每次启动都先在uboot命令行下通过setenv,saveenv来修改传入kernel的环境变量,因此uboot提供了fw_printenv工具来让用户在文件系统下来查看和修改环境变量,具体步骤如下:
1.编译fw_printenv工具:
在uboot源码目录下,执行:
make env ARCH=xxx CROSS_COMPILE=yyy
其中xxx和yyy根据自己的交叉编译环境来配置
接着会在tools/env下生成fw_printenv的可执行文件,将其拷贝到文件系统中的/usr/bin(此路径可以自己指定)目录下,再创建fw_printenv的软链接(直接cp也可以):
ln -s /usr/bin/fw_printenv /usr/bin/fw_setenv
2.配置fw_env.config文件
根据mtd分区、UBOOT环境变量的位置、大小等内容修改uboot源码目录的tools/env下的fw_env.config文件,具体的修改方法见fw_env.config文件中的说明及/tools/env/README文件,我的修改内容如下作为参考(需根据实际情况来修改):
# MTD device name Device offset Env. size Flash sector size
/dev/mtd0 0xc0000 0x2000 0x10000
其中Device offset,Env size和Flash sector size应该分别对应于uboot源码目录中include/configs/xxxx.h相关文件中的
CONFIG_ENV_OFFSET,CONFIG_ENV_SIZE和CONFIG_ENV_SECT_SIZE三个宏定义
修改完成后,将fw_env.config文件拷贝到文件系统的/etc目录下。
3.fw_printenv的使用
在文件系统中输入fw_printenv命令来查看环境变量,输入fw_setenv xxx yyy 来修改环境变量(xxx为变量名,yyy为变零值),方法类似setenv,修改后会自动保存,详细用法通过fw_printenv --help命令来查看
uboot修改linux源码中参数,将自定义参数从uboot传入kernel的并读取的方法【转】相关推荐
- Linux源码中的mktime算法解析
Linux源码中的mktime算法解析 我们知道,从CMOS中读出来的系统时间并不是time_t类型,而是类似于struct tm那样,年月日时分秒是分开存储的. 那么,要把它转化为系统便于处理的ti ...
- linux源码中ar8031驱动,AM335xd + KSZ8863RLL Linux网络底层驱动问题
开发平台AM335XD, 添加一款网络接口芯片 swith PHYs ksz8863RLL,百兆以太网模式, 接口为RMii, 原来开发版Linux内核配置的是一个千兆以太网PHY芯片 ar8031, ...
- linux源码中,.org 0x2000,ENTRY(pg1)表示的是什么意思?org是什么意思,ENTRY是什么意思啊?
.org 0x2000表示内容填充至地址0x2000.如:你的文件有0x1000字节,你指定链接器ld将该文件的内容加载到内存地址0x0000,这样文件最末就在地址0x0FFF上,你承认吧.如果在文件 ...
- Linux内核源码中使用宏定义的若干技巧
在C中,宏定义的概念虽然简单,但是真要用好却并不那么容易,下面从Linux源码中抽取一些宏定义的使用方法,希望能从中得到点启发: 1. 类型检查 比如module_init的宏定义: 点击(此处)折叠 ...
- 关于在Ubuntu中修改Android源码的一些总结
关于在ubuntu中修改Android源码的一些总结 1.关于配置VMware,网上有一大堆的方法,这里就不详述了,我现在用的源码是4.0.3的.要想改源码,你需要以下基本的东西: 推荐配置: OS ...
- Rust for Linux 源码导读 | Ref 引用计数容器 原创
引子 2022 年,我们很可能会看到 Linux 内核中的实验性 Rust 编程语言支持成为主流.2021.12.6 早上发出了更新的补丁,介绍了在内核中处理 Rust 的初始支持和基础设施. 这次更 ...
- ctags 生成简明易用 linux 源码 tags
问题所在 一般使用ctags 就是用ctags -R生成tags.不过这样看源码时会有两个问题: 假如同一个函数在不同的处理器架构中都有实现,那么跳转时,会出现很多你不关心的架构的函数原型.比如你关注 ...
- 关于在ubuntu中修改Android源码的一些细节
1.关于配置VMware,网上有一大堆的方法,这里就不详述了,我现在用的源码是4.0.3的.要想改源码,你需要以下基本的东西: 推荐配置: OS Ubuntu 11.04 64bit Gcc 4.5. ...
- 修改marathon源码后,如何编译,部署到集群中?
首先,marathon源码是由scala语言编写,由sbt进行项目构建的:与spark不同,spark是由maven进行项目构建: 方案一:使用intellij idea导入marathon源码[目前 ...
最新文章
- [Freescale]E9学习笔记-LTIB安装配置
- 阿里云DDoS高防 - 访问与攻击日志实时分析(二)
- Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
- shiro 的session持久化
- MySql链接字符串 各种程序连接大合集(包括asp.net,c#,等等)
- OpenCV3实现人脸识别(三)——训练与识别自己的人脸数据
- kubesphere报错收集
- 详解ASP.NET页面的aspx扩展
- 555定时器回差电压计算公式_555时基电路引脚解析
- 2017.9.5 postgresql加密函数的使用
- puppet-dashboard安装及用apache和nginx进行管理
- 手动抛出异常_(七)异常处理
- ant vue 树形菜单横向显示_快速实现一个简单可复用可扩展的Vue树组件
- Symbian 5800 重力开发的一些数据
- 关于盒子模型的应用(制作三角形)
- 基于H5的移动端APP开发框架
- Quartus II三种方式实现D触发器
- while循环的使用
- 输入一个四位数字x,分别求出x的个位数字、十位数字、百位数字和千位数字的值 ,并求个位、十位、百位、千位的和 -C语言
- Java接入微信支付超级详细教程——从入门到精通