cmdline -[command line,__fdt_pointer,initial_boot_params] boot_command_line 获取
[boot_command_line,cmdline,commandline,devicetree地址]
head.S->start_kernel(), head.S 中主要是获取dt的地址:
str_l x21, __fdt_pointer, x5 // Save FDT pointer
>>start_kernel() -- main.c
>>setup_arch() --setup.c
>>setup_machine_fdt()
>>early_init_dt_scan() --fdt.c
>>early_init_dt_verify() --fdt.c ;check __fdt_pointer后,赋给initial_boot_params
>>early_init_dt_scan_nodes() --fdt.c ;最终获取devicetree参数
>>early_init_dt_scan_chosen --fdt.c; 获取command line 参数
setup_arch(&command_line);
command_line 是对 全局变量boot_command_line的一个引用
setup_machine_fdt()
__fdt_pointer 经过fixmap_remap_fdt(dt_phys) 映射后,往下传参
early_init_dt_scan_nodes
获取 command_line参数,给boot_command_line 赋值
获取memory参数
int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
int depth, void *data)
{
int l;
const char *p;pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname);
if (depth != 1 || !data ||
(strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
return 0;early_init_dt_check_for_initrd(node);
/* Retrieve command line */
p = of_get_flat_dt_prop(node, "bootargs", &l);
if (p != NULL && l > 0)
strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); //拷贝到 boot_command_line/*
* CONFIG_CMDLINE is meant to be a default in case nothing else
* managed to set the command line, unless CONFIG_CMDLINE_FORCE
* is set in which case we override whatever was found earlier.
*/
#ifdef CONFIG_CMDLINE
#if defined(CONFIG_CMDLINE_EXTEND)
strlcat(data, " ", COMMAND_LINE_SIZE);
strlcat(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
#elif defined(CONFIG_CMDLINE_FORCE)
strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
#else
/* No arguments from boot loader, use kernel's cmdl*/
if (!((char *)data)[0])
strlcpy(data, CONFIG_CMDLINE, COMMAND_LINE_SIZE);
#endif
#endif /* CONFIG_CMDLINE */pr_debug("Command line is: %s\n", (char*)data);
/* break now */
return 1;
}void __init early_init_dt_scan_nodes(void)
{
/* Retrieve various information from the /chosen node */
of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);/* Initialize {size,address}-cells info */
of_scan_flat_dt(early_init_dt_scan_root, NULL);/* Setup memory, calling early_init_dt_add_memory_arch */
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
}
bootloader 参数传递
我们常用的方式是在bootload中通过bootargs直接传递(arm64) ,只需要在BootLinux函数中修改即可,往BootParamlistPtr.CmdLine
变量后面粘贴一个字符串(ql_crash_mode=0,0
)。在UpdateCmdLine函数中会对一系列(很多很多)的cmdline进行预处理
EFI_STATUS BootLinux (BootInfo *Info)
{xxxxxxxxxx
#ifdef QL_DEBUG_MODE
if ( Info->BootWithDebug == TRUE){
AsciiStrCatS (BootParamlistPtr.CmdLine, BOOT_ARGS_SIZE, " debug=1");
}
#endif#ifdef QL_DUMP_MODE
if ( Info->BootWithDump == TRUE){
AsciiStrCatS (BootParamlistPtr.CmdLine, BOOT_ARGS_SIZE, " ql_crash_mode=0,0");
}
#endif
Status = UpdateCmdLine (BootParamlistPtr.CmdLine, FfbmStr, Recovery,
AlarmBoot, Info->VBCmdLine, &BootParamlistPtr.FinalCmdLine,
&BootParamlistPtr.FinalBootConfig,
&BootParamlistPtr.FinalBootConfigLen,
Info->HeaderVersion,
(VOID *)BootParamlistPtr.DeviceTreeLoadAddr);xxxxxxxxxx
Status = LoadAddrAndDTUpdate (Info, &BootParamlistPtr);
if (Status != EFI_SUCCESS) {
return Status;
}
xxxxxxxxxx
}
UpdateCmdLine处理完成后,由LoadAddrAndDTUpdate携带BootParamlistPtr参数经过后续一系列调用后,最终会在UpdateDeviceTree 函数中将cmdline中记录的所有数据全部添加到bootargs的设备节点中
EFI_STATUS UpdateDeviceTree (VOID *fdt,CONST CHAR8 *cmdline,VOID *ramdisk,UINT32 RamDiskSize,BOOLEAN BootWith32Bit)
{
xxxxxxxxxxxx
if (cmdline) {
/* Adding the cmdline to the chosen node */
FdtPropUpdateFunc (fdt, offset, (CONST char *)"bootargs",
(CONST VOID *)cmdline, fdt_appendprop_string, ret);
if (ret) {
DEBUG ((EFI_D_ERROR,
"ERROR: Cannot update chosen node [bootargs] - 0x%x\n", ret));
return EFI_LOAD_ERROR;
}
}
xxxxxxxxxxxx
}
FdtPropUpdateFunc :将参数添加到fdt bootargs中
参数接收处理
bootload传输过来cmdline之后,我们只需要在适当的位置添加内核参数的处理函数。假如bootloader在启动kernel时传递的参数是"ql_crash_mode=xxx",kernel运行的时候就会自动调用set_crash_mode函数,通过s参数将cmdline携带的参数带入函数。
static int __init set_crash_mode(char *s)
{
xxxxxxxxxx
}
__setup("ql_crash_mode=", set_crash_mode);
注:参照 内核参数cmdline后续处理源码分析-1
cmdline -[command line,__fdt_pointer,initial_boot_params] boot_command_line 获取相关推荐
- mysql command line client 目标不对_简单几招提高MySQL安全性
摘要: 导读 如何提高MySQL的安全性 数据库的安全性无疑很重要,这里教大家几招简单方法提高安全性. 1. 正确设置 datadir 权限模式 关于 datadir 正确的权限模式是 0750,甚至 ...
- Linux Command Line 解析
处理模型 Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的.在进行后续分析之前,先来理解一下command line 的处理模 ...
- Yetiarnold for maya一键安装部署(二)另附yetiarnold for maya command line render
一.Yeti&arnold for maya一键安装部署(更新修复) http://u.163.com/wUzEMj9K 提取码: 3o1t1cMd 很久没更新东西了,要写的东西很多,需要一 ...
- 【The Linux Command Line】学习笔记
以下内容参考于书籍<The Linux Command Line>,中文版本翻译项目:快乐的 Linux 命令行 终端 提示符:$ 表示普通用户,# 表示超级用户 鼠标与光标:使用光标选择 ...
- Xcode Command Line Tools命令
xcode-select使用说明 Usage: xcode-select [options]Print or change the path to the active developer direc ...
- Windows常用command line操作
使用command line的优势在于: 速度比GUI更快 有一些软件和工具只能通过command line进行操作 目录 1. 改变目录 2. 列出文件和目录 [Tab自动补全目录名] 3. 打开文 ...
- mysql客户端指令_mysql command line client(mysql命令行客户端)
mysql command line client(mysql命令行客户端) (2010-03-24 09:18:38) 标签: 文化 分类: 数据库 1.输入密码:****** 2.ues mysq ...
- mysql command line闪退_MySQL Command Line Client 打不开(闪退)的解决
网上搜索到的解决办法: 1.找到mysql安装目录下的bin目录路径. 2.打开cmd,进入到bin目录的路径下,输入mysql -u root -p. 问题分析: 1.查看mysql command ...
- MySQL中MySQL X.X Command Line Client一闪而过的问题
问题介绍:我安装完MySQL(我安装的是5.5)后,使用MySQL 5.5 Command Line Client,每次点击,总是一闪而过.解决方法如下: 首先进入cmd 切入MySQL的安装目录,然 ...
最新文章
- c++设计模式之状态模式
- Oracle创建用户并给用户授权查询指定表或视图的权限
- html引用c 变量,在jsp页面中定义全局变量,供其他页面引用
- 推荐一款神器-VBAC#代码编辑管理器
- AMD、CMD、CommonJs、ES6的对比
- linux查看程序中最耗时的代码,【Linux】CPU时间与处理器耗时
- 欧几里得求最大公约数--JAVA递归实现
- 计算机科学与技术考研多少分算高分,清华计算机科学与技术系考研初复试高分经验分享...
- Flutter之Redux框架入门
- 如何查询一个网站的域名备案信息?
- 防saq注入_盛大在线另一分站某SQL注入
- 长春市职称计算机考试成绩查询,长春市助理工程师查询网站
- Vue组件的抽离和封装
- 三星s8升级到android9相机,三星S8拍照怎么样?S8相机官方详解
- 论技术交流的重要性,两个PMOS管背靠背用法详解
- 最快的BT软件rtorrent Step by Step指南
- 我的世界服务器怎么做无限的弓,我的世界制作无限弓流程介绍
- 青龙面板篇——美团(细致教程 有手就行~)
- 【Lambda】LCAC第十四次会议重要内容摘取
- 成为Java顶尖程序员 ,看这9本书就够了
热门文章
- java 读取局域网交换机_局域网技术_交换机的工作方式
- 持续贡献开源力量,棱镜七彩加入openKylin
- 超启发式算法Hyper heuristic
- 好用的bim插件丨在Revit中怎么画斜柱?
- oracle数据表造成死锁,解决方法
- 数电实验一——组合逻辑电路
- 新站发布——寻爱交友网
- 【东方博宜】1112 - 【入门】查找子串并替换
- 一种对不同类型齐格勒-尼科尔斯 P-I-D 控制器调谐算法研究(Matlab代码实现)
- 学习Transformer前言(Self Attention Multi head self attention)