2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 在linux kernel或android中解析cmdline参数

在linux kernel或android中解析cmdline参数

时间:2020-03-04 07:57:36

相关推荐

在linux kernel或android中解析cmdline参数

文章目录

★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★

Kernel command line: earlycon androidboot.selinux=permissive uart_dma keep_dbgclk_on clk_ignore_unused initrd=0xd0000000,38711808 rw crash_page=0x8f040000 initrd=/recoveryrc boot_reason=0x2000 ota_status=0x1001

1、在linux kernel中解析cmdline参数

(以init,rdinit为例)

vim kernel/linux/init/main.c (即kernel_init函数所在的文件)

如代码所示__setup是一个宏,如果cmdline中有这个参数,则会执行对应的后面的函数。

下面这两个函数,会将cmdline中解析到的“init=”、“rdinit=”后面的字串写入到execute_command和ramdisk_execute_command全局变量中.

然后在kernel的代码中,就可以使用这两个变量了.

static int __init init_setup(char *str){unsigned int i;execute_command = str;/** In case LILO is going to boot us with default command line,* it prepends "auto" before the whole cmdline which makes* the shell think it should execute a script with such name.* So we ignore all arguments entered _before_ init=... [MJ]*/for (i = 1; i < MAX_INIT_ARGS; i++)argv_init[i] = NULL;return 1;}__setup("init=", init_setup);static int __init rdinit_setup(char *str){unsigned int i;ramdisk_execute_command = str;/* See "auto" comment in init_setup */for (i = 1; i < MAX_INIT_ARGS; i++)argv_init[i] = NULL;return 1;}__setup("rdinit=", rdinit_setup);

2、在android中解析cmdline参数

(以androidboot.selinux=permissive为例)

如下列代码所示,android的应用程序会读取"/proc/cmdline"中的字符串,然后解析相应的字段,报错到变量中。

vim system/core/init/selinux.cpp

v

oid import_kernel_cmdline(bool in_qemu,const std::function<void(const std::string&, const std::string&, bool)>& fn) {std::string cmdline;android::base::ReadFileToString("/proc/cmdline", &cmdline);for (const auto& entry : android::base::Split(android::base::Trim(cmdline), " ")) {std::vector<std::string> pieces = android::base::Split(entry, "=");if (pieces.size() == 2) {fn(pieces[0], pieces[1], in_qemu);}}}

vim system/core/init/util.cpp

EnforcingStatus StatusFromCmdline() {EnforcingStatus status = SELINUX_ENFORCING;import_kernel_cmdline(false,[&](const std::string& key, const std::string& value, bool in_qemu) {if (key == "androidboot.selinux" && value == "permissive") {status = SELINUX_PERMISSIVE;}});return status;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。