Linux Command Line 详细解析

Command-Line-Encoder:编码和解码文本参数以在Windows的命令行上使用 命令行编码器 使用此库,您可以在命令行上安全地编码/转义文本参数。 您可以从此处下载该库: 或者直接将Utils.cs类从以下位置复制到您的项目中: 特征 在命令行中使用文本参数时,CommandLineEncoder处理以下边缘情况 斜杠后加引号 引号 结束报价前的最后一个斜杠 换行 如何使用 从以下位置将Utils.cs类复制到您的项目中: 或此处的最新版本的参考库: 调用EncodeArgText(“ Some Value”)对要在命令行上使用的文本参数进行编码。 string args = String.Format("--someFlag1 --testVal \"{0}\" --someFlag2", CommandLineEncoder.Utils.EncodeArgText(argText)); System.Diagnostics 立即下载

处理模型

Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的。在进行后续分析之前,先来理解一下command line 的处理模型:
要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw 。
那么kernel 就需要提供对这些参数进行处理的处理函数列表。根据参数的作用以及执行期的先后不同,这些处理函数被定义到不同的段中。针对每一个参数,Kernel 都会到相应的段中查找相应的处理函数,最终进行各个组件的配置。

1 配置格式

常见的配置格式如:
console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs initrd=0x10800000,0x14af47

2 配置方式

2.1 Bootloader动态配置

由bootloader 进行参数配置,command line 将做为atag_list 的一个节点传递到Kernel。

2.2 Kernel 静态配置

通过make menuconfig 进行配置:运行后配置boot options->Default kernel command string 。该配置将被静态编译到Kernel中,通过变量default_command_line 访问。

3  解析配置

3.1 相关定义

根据执行的先后顺序,可以将处理函数分为三个大类,他们分别存在于下面三个段中(参考top/arch/arm/kernel/vmlinux.lds ):
__setup_start = .; *(.init.setup) __setup_end = .;
__early_begin = .; *(.early_param.init) __early_end = .;
__start___param = .; *(__param) __stop___param = .;
这三个段内存储的不是参数,而是command line 参数所需要的处理函数。

3.1.1 .early_param.init段

“.early_param.init ” 所定义的处理相对靠前一些,它所处理的参数例如:initrd= ,cachepolicy= ,nocache, nowb , ecc= , vmalloc= , mem= ,等等。
这些处理函数是通过__early_param宏来定义的,例如:

static void __init early_initrd(char **p)
{ …… }
__early_param("initrd=", early_initrd);

对于宏__early_param,可以在top/arch/arm/include/asm/Setup.h 中找到如下定义:
struct early_params {
    const char *arg;
    void (*fn)(char **p);
};
#define __early_param(name,fn) \
static struct early_params __early_##fn __used \
__attribute__((__section__(".early_param.init"))) = { name, fn }
“.init.setup ”定义的处理则要靠后一些,它所处理的参数例如:nfsroot= , ip= ,等等。
这些处理函数是通过__setup宏来定义的,例如:
static int __init nfs_root_setup(char *line)
{ …… }
__setup("nfsroot=", nfs_root_setup);
对于宏__setup,可以在top/include/linux/Init.h 中看到:
#define __setup_param(str, unique_id, fn, early) \
    static char __setup_str_##unique_id[] __initdata __aligned(1) = str; \
    static struct obs_kernel_param __setup_##unique_id \
           __used __section(.init.setup) \
           __attribute__((aligned((sizeof(long))))) \
           = { __setup_str_##unique_id, fn, early }

#define __setup(str, fn) \
    __setup_param(str, fn, fn, 0)

/* NOTE: fn is as per module_param, not __setup! Emits warning if fn
* returns non-zero. */
#define early_param(str, fn) \
    __setup_param(str, fn, fn, 1)
注意看的话,可以看到还有一个宏early_param,它与宏__setup的定义相似,只不过最后一个宏参数是1 而不是0 。1表示需要提前处理的参数。

3.1.3 __param段

这个段中保存的是build-in 类型module 的配置参数。该宏直接用来修饰需要的变量。

3.2  解析

3.2.1 相关变量

相关的变量包括:
default_command_line:
保存memuconfig 配置的参数,如果bootloader 传入了命令行参数,那么这个新的配置将被更新到该变量中。
boot_command_line:
存在于.init.data 段。最初是default_command_line 的拷贝。
command_line:
存在于.init.data 段。在parse_cmdline() 中被赋值,数据来源是default_command_line 。
saved_command_line:
用于保存没有处理过的命令行参数,是boot_caommand_line 的拷贝。
static_command_line:
是command_line 的拷贝。

3.2.2 主要函数

函数名称:parse_cmdline()
操作数据:default_command_line。
函数列表: .early_param.init 段(在__early_begin 和__early_end 之间)。
函数功能: 依据函数列表对default_command_line 中的参数进行处理。
函数名称:parse_early_param()
操作数据:boot_command_line。
函数列表: .init.setup 段中(__setup_start 和__setup_end 之间),主要是通过宏early_param定义的部分。
函数功能: 依据函数列表对boot_command_line 中的参数进行处理。
注意parse_one() 的第四个入参是0 ,而且第五个参数是NULL 。这里没有给出参数队列,不会对boot_command_line的每个参数在参数队列中进行对比查找,而是直接在do_early_param() 中进行条件判断,如果满足下面的条件,那么对该参数进行对应的操作:
if ((p->early && strcmp(param, p->str) == 0) ||
                  (strcmp(param, "console") == 0 &&
                   strcmp(p->str, "earlycon") == 0)
              )
函数名称:parse_args()
操作数据:static_command_line。
函数列表: __param 段(__start___param 和__stop___param 之间)。
函数功能: 该操作将依据函数列表,对static_command_line 中的参数进行相应的操作。这个操作在parse_one() 的第一部分代码完成:
for (i = 0; i < num_params; i++) {
          if (parameq(param, params[i].name)) {
                 DEBUGP("They are equal! Calling %p\n",
                        params[i].set);
                 return params[i].set(val, &params[i]);
          }
   }
接下来对于不被这个列表所支持的参数,将在unknown_bootoption() 中进行处理。在unknown_bootoption() 中主要是obsolete_checksetup()的操作。
函数名称:obsolete_checksetup()
操作数据:static_command_line。
函数列表: .init.setup 段中(__setup_start 和__setup_end 之间),主要是通过宏__setup定义的部分。
函数功能: 该操作将依据函数列表,对static_command_line 中的参数进行相应的操作。如果是在parse_early_param() 中已经处理的操作,那么这里不再处理;如果是查找到的条目中没有操作函数,那么这表示是过时的数据定义(有些早期的代码,没有定义这个函数);如果不是以上两种情形,那么利用找到的函数对参数进行处理。

3.2.3图示

 

DeerFlow 系列教程 第十六篇 | 实战案例一——用 DeerFlow 进行深度研究 在日常使用 AI Agent 时,最常见的需求之一就是对某个主题进行全面、系统的研究。多源信息采集——不能只依赖单次搜索,需要从多个角度搜索不同来源交叉验证——不同来源的信息需要相互印证,避免单一信源的偏差结构化输出——最终产出的不是零散的信息片段,而是有组织的研究报告传统做法是人工反复搜索、阅读、整理。传统手工研究: DeerFlow 深度研究:人工搜索 → 阅读页面 → 记笔记 提交研究主题│ │▼ ▼换关键词 → 再搜索 → 再阅读 ┌──────────────────┐。 阅读详情

相关推荐

红日-VulnStack靶场-ATT&CK(二):从Weblogic漏洞到域控渗透实战

本文详细解析了红日安全团队VulnStack靶场中从Weblogic漏洞到域控渗透的完整攻击链。通过实战演示Weblogic反序列化漏洞利用、Cobalt Strike持久化控制、域内信息收集及PsExec横向移动等关键技术,复现了企业内网渗透的典型场景,并提供了防御建议。

tgb3456789的博客 934

Windows常用command line操作

使用command line的优势在于: 速度比GUI更快 有一些软件和工具只能通过command line进行操作 目录 1. 改变目录 2. 列出文件和目录 [Tab自动补全目录名] 3. 打开文件 [清空界面,筛选文件格式,/? 命令提示符] 4. 创建和移除目录 5. 关于路径PATH 6. 关于Drives

NaomiEdna的博客 3万+

STM32_DAC

DAC(Digital-to-Analog Converter,数模转换器)是将数字信号转换为模拟信号的外设,广泛应用于音频输出、波形生成、电机控制等场景。STM32F407 系列芯片配备了 2 个 DAC 通道(DAC1 和 DAC2),支持 12 位分辨率,支持多种触发方式,可输出稳定的模拟电压。本文从 DAC 的基本原理出发,详细讲解 STM32F407 DAC 的配置方法、代码实现、波形生成以及实际应用案例,帮助你快速掌握 DAC 的使用技巧。

轩宇的博客 1239

IDEA 启动错误提示:Command line is too long. Shorten command line

在 IntelliJ IDEA 或其他 JetBrains IDE 中遇到 “Command line is too long. Shorten command line” 的错误时,这通常是因为项目类路径太长了。不过,这是一个比较高级的操作,并且可能会影响系统的稳定性,因此只建议在您明白所做更改的后果的情况下尝试这种方法。在 “Configuration” 选项卡中,找到 “Shorten command line” 选项,通常在 “JRE” 选项的下方。方法 2:增加操作系统的命令行长度限制。

无间行者 5670

AG16K MCU ARM Cortex M3

其中,Input文件为Keil生成的mcu程序文件,输出为合成后的存储格式Bin文件,Program address 为上方表格中“程序运行 RAM 地址(4bytes)”,即 Keil 中设置的程序运行地址。其中 MCU 程序的地址,根据 mcu.ip 中设置的 FLASH_BIAS 进行设置。AG16K MCU 的 FPGA 工程中,需调用 alta_mcu_m3 的硬核 IP,包含在 alta_sim.v 的库文。Quartus II。//MCU 程序在 FLASH 中存放的首地址。

Embeded_FPGA的博客 1804

新手工程师必看:搞定EMI传导干扰,从理解差模和共模开始(附实战案例)

本文深入解析EMI传导干扰中的差模与共模问题,为新手工程师提供从诊断到治理的完整方法论。通过实战案例展示如何通过频谱分析、近场探头扫描等技术精准定位干扰源,并分享PCB布局、滤波器设计等系统级解决方案,帮助工程师高效解决传导干扰问题,提升EMC设计能力。

weixin_26757925的博客 469

解决:Command line is too long. Shorten command line for xxx or also for Application default configurat

点击项目启动配置项 --> Enviroment --> Shorten command line 选项 --> 选择 classpath file 或JAR manifest 选项 --> 重新启动工程运行即可。解决方法有两种,正如报错信息截图所示,缩短命令行或者改为应用程序默认配置。

zlfjavahome的专栏 1万+

华大HC32F460 ADC+DMA高效数据采集实战解析

本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。

weixin_29189373的博客 176

Linux Command Line 解析

  处理模型 Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的。在进行后续分析之前,先来理解一下command line 的处理模型: 要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw 。 ...

weixin_33730836的博客 314

prometheus 从入门到精通(史上最全)

Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器,支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。原文链接:https://blog.youkuaiyun.com/qq_45277554/article/details/130917620时间序列数据。

流水_鱼鱼的博客 1万+

可控异常的契约化设计:在 ABAP 中用 CX_STATIC_CHECK 把可预期错误变成接口的一部分

文章摘要: 本文探讨了ABAP系统中异常处理的工程化设计原则,强调将可预期的业务异常作为接口契约的一部分。核心观点是:对于调用方能够合理处理的错误情况,应使用继承自CX_STATIC_CHECK的受检异常,通过方法签名强制调用方处理或显式转发。文章对比了ABAP三大异常根类的适用场景,提出"三问法"判断异常是否适合受检处理,并给出了包含上下文信息的异常类实现示例。通过Fiori文件上传案例,展示了如何在分层架构中合理传递和转换异常,最终在OData服务层将业务异常映射为标准错误响应。这种

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3060

【一天掌握CommandLine】基础入门

打印内容(echo) 使用echo可以打印内容,单引号和双引号等效 取消命令(ctrl+c) ctrl + c可以取消命令的执行,常用于命令输入错误,或不想继续执行的场景,也可以中断正在执行的命令。 光标移动(ctrl+a, ctrl+e) ctrl + a移至行首 ctrl + e移至行尾 移动至任意位置(option+鼠标点击) 历史命令(向上箭头或向下箭头) 清理屏幕(ctrl+l或者clear) 清理光标后的输入(ctrl+

『程序员·小李』的博客 1705

TC397 EB MCAL开发从0开始系列 之 [17.1] ETH配置实战 - ping/发送

TC397 MCAL 从0开始之 ETH ping测试

yy九歌的博客 1505

Linux command line详细解析

全局变量 1.command_line 2.default_command_line 3.saved_command_line 内核参数的解析一共有两处,一处是setup_arch()-&gt;parse_cmdline()用于解析内核参数中关于内存的部分,另外一处是start_kernel()-&gt;parse_option()用于解析其余部分。 解析配置 根据执行的先后顺序,可以...

金溪的博客 6823

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux中FRline函数运用,Linux Command Line 详细解析

处理模型Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的。在进行后续分析之前,先来理解一下commandline 的处理模型:要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw 。那么kernel 就需要提供...

weixin_28822657的博客 273

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

以isolcpus=参数为例,介绍Linux kernel中command-line(cmdline)的读写、解析、生效过程

以isolcpus=参数为例,介绍Linux kernel中command-line(cmdline)的读写、解析、生效过程。这篇文章介绍了isolcpus参数的作用,键值对格式;以及介绍了start_kernel(), System.map中映像中__setup段和__param段参数,以及一系列与isolcpus相关的函数

weixin_48185168的博客 3706

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: MACHINE_START and MACHINE_END Macro define
下一篇: linux下platform_device中的dma_mask与coherent_dma_mask
wang-bob
博客等级 码龄20年 356粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值