[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 获取相关推荐

  1. mysql command line client 目标不对_简单几招提高MySQL安全性

    摘要: 导读 如何提高MySQL的安全性 数据库的安全性无疑很重要,这里教大家几招简单方法提高安全性. 1. 正确设置 datadir 权限模式 关于 datadir 正确的权限模式是 0750,甚至 ...

  2. Linux Command Line 解析

    处理模型 Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的.在进行后续分析之前,先来理解一下command line 的处理模 ...

  3. Yetiarnold for maya一键安装部署(二)另附yetiarnold for maya command line render

    一.Yeti&arnold for maya一键安装部署(更新修复) http://u.163.com/wUzEMj9K  提取码: 3o1t1cMd 很久没更新东西了,要写的东西很多,需要一 ...

  4. 【The Linux Command Line】学习笔记

    以下内容参考于书籍<The Linux Command Line>,中文版本翻译项目:快乐的 Linux 命令行 终端 提示符:$ 表示普通用户,# 表示超级用户 鼠标与光标:使用光标选择 ...

  5. Xcode Command Line Tools命令

    xcode-select使用说明 Usage: xcode-select [options]Print or change the path to the active developer direc ...

  6. Windows常用command line操作

    使用command line的优势在于: 速度比GUI更快 有一些软件和工具只能通过command line进行操作 目录 1. 改变目录 2. 列出文件和目录 [Tab自动补全目录名] 3. 打开文 ...

  7. mysql客户端指令_mysql command line client(mysql命令行客户端)

    mysql command line client(mysql命令行客户端) (2010-03-24 09:18:38) 标签: 文化 分类: 数据库 1.输入密码:****** 2.ues mysq ...

  8. mysql command line闪退_MySQL Command Line Client 打不开(闪退)的解决

    网上搜索到的解决办法: 1.找到mysql安装目录下的bin目录路径. 2.打开cmd,进入到bin目录的路径下,输入mysql -u root -p. 问题分析: 1.查看mysql command ...

  9. MySQL中MySQL X.X Command Line Client一闪而过的问题

    问题介绍:我安装完MySQL(我安装的是5.5)后,使用MySQL 5.5 Command Line Client,每次点击,总是一闪而过.解决方法如下: 首先进入cmd 切入MySQL的安装目录,然 ...

最新文章

  1. c++设计模式之状态模式
  2. Oracle创建用户并给用户授权查询指定表或视图的权限
  3. html引用c 变量,在jsp页面中定义全局变量,供其他页面引用
  4. 推荐一款神器-VBAC#代码编辑管理器
  5. AMD、CMD、CommonJs、ES6的对比
  6. linux查看程序中最耗时的代码,【Linux】CPU时间与处理器耗时
  7. 欧几里得求最大公约数--JAVA递归实现
  8. 计算机科学与技术考研多少分算高分,清华计算机科学与技术系考研初复试高分经验分享...
  9. Flutter之Redux框架入门
  10. 如何查询一个网站的域名备案信息?
  11. 防saq注入_盛大在线另一分站某SQL注入
  12. 长春市职称计算机考试成绩查询,长春市助理工程师查询网站
  13. Vue组件的抽离和封装
  14. 三星s8升级到android9相机,三星S8拍照怎么样?S8相机官方详解
  15. 论技术交流的重要性,两个PMOS管背靠背用法详解
  16. 最快的BT软件rtorrent Step by Step指南
  17. 我的世界服务器怎么做无限的弓,我的世界制作无限弓流程介绍
  18. 青龙面板篇——美团(细致教程 有手就行~)
  19. 【Lambda】LCAC第十四次会议重要内容摘取
  20. 成为Java顶尖程序员 ,看这9本书就够了

热门文章

  1. java 读取局域网交换机_局域网技术_交换机的工作方式
  2. 持续贡献开源力量,棱镜七彩加入openKylin
  3. 超启发式算法Hyper heuristic
  4. 好用的bim插件丨在Revit中怎么画斜柱?
  5. oracle数据表造成死锁,解决方法
  6. 数电实验一——组合逻辑电路
  7. 新站发布——寻爱交友网
  8. 【东方博宜】1112 - 【入门】查找子串并替换
  9. 一种对不同类型齐格勒-尼科尔斯 P-I-D 控制器调谐算法研究(Matlab代码实现)
  10. 学习Transformer前言(Self Attention Multi head self attention)