cmdline

-----先尝试里面再bootlinux里加的方法:https://blog.csdn.net/weixin_44570083/article/details/127481117
-----替换auth那个字符串,用bootargs里的一个代替,确认可以读到
-----搜索MTK那套 LK K如何设置合获取的
-----搜搜GERRIT cmdline
-----搜索bootlinux里的参数(chosen下bootargs参数),应该是这里添加的才会放到bootargs
-----再确认 adb cat chosen结果。不对 所有参数都是放到updatecmdline里的 应该都在proc/cmdline才对
在函数fdt_chosen() 函数中,读取环境变量 bootargs 的值,并设置到设备树的 chosen 节点下
参考:
uboot通过环境变量 bootargs 传递参数给 kernel 内核,bootargs存储在设备树的 chosen 节点中,则 kernel 内核是通过读取设备树的 chosen 节点中的 bootargs 属性获取 uboot 传递过来的参数。
do_bootz()---> do_bootm_states() ---> bootm_os_get_boot_func()(得到函数do_bootm_linux())boot_fn()(实际就是函数do_bootm_linux()) ---> boot_prep_linux() ---> image_setup_linux() ---> image_setup_libfdt() ---> fdt_chosen()
在函数 fdt_chosen() 函数中,读取环境变量 bootargs 的值,并设置到设备树的 chosen 节点下

linux驱动——cmdline原理及利用https://blog.csdn.net/sgmenghuo/article/details/41251739?utm_source=copy
内核中如果你用cat /proc/cmdline,你会看见大致如下的打印:
console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0...。当然如果我也可以在我们的项目比如扫描头的型号加个字段scanner=se955,等号赋值,name和value跟前后字段以空格分割。
那么如何从中获取呢?!
方法一:直接获取原始的cmdline的,就是获取/proc/cmdline属性值,在代码中就是读取全局变量saved_command_line这个字符串,然后自行处理,缺点是这个处理的时机比较晚,在设备驱动中处理,优点开发者自由度比较大。
有关内核参数的全局变量一共有三个,分别是command_line,default_command_line和saved_command_line,这三个变量都定义在同一个文件即arch/arm/kernel/子目录下的setup.c文件中:
方法二:利用内核的__setup或者early_param。这个两个函数宏实质上是一样的,就是early_param比__setup先处理,优点他们在内核启动阶段运行,都在设备驱动前预先运行。上定义代码,

chosen
chosen 并不是一个真实的设备, chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少。但是,当我们进入到/proc/device-tree/chosen 目录里面,会发现多了 bootargs 这个属性
由此,我们可以推出:
chosen这个节点就是将uboot里面的bootargs环境变量值,传递给linux内核,作为命令行参数,cmd line.
现在有两个疑点:
①、我们并没有在设备树中设置 chosen 节点的 bootargs 属性,那么chosen中 bootargs
这个属性是怎么产生的?
②、为何 bootargs 文件的内容和 uboot 中 bootargs 环境变量的值一样?它们之间有什么关系。
解答这个问题:
通过在uboot源码里面,进行全局查找,最后在在uboot源码里面,有个函数fdt_chosen(),用到了chosen这个变量。对这个函数进行分析,我们可以知道,这个函数的内容是:
1)、调用函数 fdt_find_or_add_subnode 从设备树(.dtb)中找到 chosen 节点,如果没有
找到的话就会自己创建一个 chosen 节点。
2)、读取 uboot 中 bootargs 环境变量的内容。
3)、调用函数 fdt_setprop 向 chosen 节点添加 bootargs 属性,并且 bootargs 属性的值
就是环境变量 bootargs 的内容。
do_bootm_linux 函数会通过一系列复杂的调用,最终通过 fdt_chosen 函数在 chosen 节点中加入了 bootargs 属性。而我们通过 bootz 命令启动 Linux 内核的时候会运行 do_bootm_linux 函数

百度AI
kernel如何获取cmdline
在Linux内核中,可以通过/proc/cmdline文件来获取内核启动时的命令行参数。这个文件包含了在引导时传递给内核的参数。

以下是一个简单的示例,展示如何从C语言程序中读取并打印这些命令行参数:

include <stdio.h>

include <stdlib.h>

int main() {
FILE *fp;
char buf[512];

// 打开/proc/cmdline文件
fp = fopen("/proc/cmdline", "r");
if (fp == NULL) {
    perror("打开/proc/cmdline文件失败");
    return 1;
}

// 读取并打印内容
if (fgets(buf, sizeof(buf), fp) != NULL) {
    printf("内核命令行参数: %s", buf);
}

// 关闭文件
fclose(fp);

return 0;

}
这段代码会打开/proc/cmdline,读取其内容,然后打印出来,最后关闭文件。这是在用户空间程序中获取内核命令行参数的常用方法。

kernel如何获取/proc/cmdline
在Linux内核中,可以通过读取/proc/cmdline来获取内核启动时的命令行参数。这个文件包含了用于启动内核的命令行参数信息。

以下是一个简单的示例,展示了如何在内核模块中读取这些参数:

include <linux/init.h>

include <linux/module.h>

include <linux/fs.h>

include <linux/uaccess.h>

// 读取/proc/cmdline的函数
char *read_proc_cmdline(void) {
struct file *file;
char *buf;
loff_t pos = 0;
ssize_t size, read_size;

file = filp_open("/proc/cmdline", O_RDONLY, 0);
if (IS_ERR(file)) {
    PTR_ERR(file);
    return NULL;
}

size = i_size_read(file->f_path.dentry->d_inode);
buf = kmalloc(size + 1, GFP_KERNEL);
if (!buf) {
    filp_close(file, NULL);
    return NULL;
}

read_size = vfs_read(file, buf, size, &pos);
filp_close(file, NULL);

if (read_size < 0) {
    kfree(buf);
    return NULL;
}

buf[read_size] = '\0'; // 添加字符串结束符
return buf;

}

static int __init cmdline_init(void) {
char *cmdline;

cmdline = read_proc_cmdline();
if (cmdline) {
    printk(KERN_INFO "Cmdline: %s\n", cmdline);
    kfree(cmdline);
}

return 0;

}

static void __exit cmdline_exit(void) {
// 清理工作(如果有)
}

module_init(cmdline_init);
module_exit(cmdline_exit);

MODULE_LICENSE("GPL");
这段代码定义了一个read_proc_cmdline函数,它打开/proc/cmdline文件,读取内容,并返回一个包含命令行参数的字符串。然后在模块的初始化函数cmdline_init中调用这个函数,并打印出读取到的命令行参数。在模块的清理函数cmdline_exit中进行必要的清理工作。
请注意,这段代码仅用于演示目的,并且在实际的内核模块中,你可能需要处理更多的错误情况和资源管理问题。

获取chosen节点下的cmdline
要获取Linux系统中chosen节点下的cmdline,可以使用以下Python代码片段:

import os

def get_chosen_cmdline():
# 尝试打开/proc/cmdline文件
try:
with open('/proc/cmdline', 'r') as cmdline_file:
cmdline = cmdline_file.read().strip()
return cmdline
except IOError:
return None

调用函数获取cmdline

cmdline = get_chosen_cmdline()
if cmdline:
print("Cmdline:", cmdline)
else:
print("无法获取cmdline信息")
这段代码尝试打开/proc/cmdline文件,这个文件包含了内核启动时的命令行参数。如果文件存在,它会读取并返回内容;如果文件不存在或者读取出现错误,则返回None。

posted @ 2024-09-03 22:47  haha222  阅读(13)  评论(0编辑  收藏  举报