日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

在linux kernel或android中解析cmdline参数

發布時間:2025/3/21 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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; }

總結

以上是生活随笔為你收集整理的在linux kernel或android中解析cmdline参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。