linux 啟動引數 實現

2021-05-27 15:11:18 字數 2319 閱讀 1102

linux 在啟動的過程中,可以採用系統預設的或uboot 傳遞來的引數進行啟動配置 

要察看當前系統的啟動引數可使用命令 cat /proc/cmdline

常用的配置引數包括:

mem=          ro        init=     loglevel   等等

這些特定的字串和具體**是通過__setup_param   和 __setup 關聯起來。

這兩個巨集的定義如下:

#define __setup_param(str, unique_id, fn, early)            \

static char __setup_str_##unique_id __initdata = str;    \

static struct obs_kernel_param __setup_##unique_id    \

__attribute_used__                \

__attribute__((__section__(".init.setup")))    \

__attribute__((aligned((sizeof(long)))))    \

= #define __setup(str, fn)                    \

__setup_param(str, fn, fn, 0)

#define early_param(str, fn)                    \

__setup_param(str, fn, fn, 1)

它們把函式名和函式呼叫的位址放到了乙個結構體中,並借助聯結器把這樣的結構體 放在了乙個叫做 .init.setup的段中。

例如:  

有一函式  :static int __init foo(char *str);

希望把它和字串「foo=」 聯絡在一起,則可以在**中新增巨集:

__setup("foo=" , foo);

展開後就是如下的形式

static char __setup_str_foo __initdata = "foo=";   

static struct obs_kernel_param __setup_foo   

__attribute_used__               

__attribute__((__section__(".init.setup")))   

__attribute__((aligned((sizeof(long)))))   

= ;//"foo=",foo,0

也就是說,啟動引數(函式指標)被封裝到obs_kernel_param結構中,

所有的核心啟動引數形成核心映像.init.setup段中的乙個

obs_kernel_param陣列

另外也可以呼叫用early_param巨集來申明需要'早期'處理的啟動引數,例如在

arch\arm\kernel\setup.c就有如下的申明:

early_param("mem", parse_mem);

展開後和__setup是一樣的只是early引數不一樣,因此會在do_early_param

中被處理

核心在啟動時會呼叫kernel\init\main.c 中的start_kernel 函式,在該函式中

parse_early_param();

parse_args("booting kernel", static_command_line, __start___param,

__stop___param - __start___param,

&unknown_bootoption);

分別負責解析__setup() 和 early_param()

parse_esrly_param()通過下面函式遍歷obs_kernel_param陣列,呼叫

支援函式

static int __init do_early_param(char *param, char *val)

}/* we accept everything at this stage. */

return 0;

}parse_args會呼叫下面函式:

static int __init obsolete_checksetup(char *line)

else if (!p->setup_func) else if (p->setup_func(line + n))//呼叫支援函式

return 1;

}p++;

} while (p < __setup_end);

return had_early_param;

}

Linux啟動引數

linux noapic 跳過硬體檢測 linux pci noapic 跳過pci卡部分硬體檢測 linux ide nodma 禁用所有ide裝置的dma支援 linux mem 1536m 記憶體超過1g時可能會用到 linux vga 0 設定vga為預設 linux acpi off 關閉...

Linux啟動引數

u boot的環境變數值得注意的有兩個 bootcmd 和bootargs。u bootcmd 前面有說過bootcmd是自動啟動時預設執行的一些命令,因此你可以在當前環境中定義各種不同配置,不同環境的引數設定,然後設定bootcmd為你經常使用的那種引數。u bootargs bootargs是環...

Linux的核心啟動引數

linux核心在啟動的時候,能接收某些命令列選項或啟動時引數。當核心不能識別某些硬體進而不能設定硬體引數或者為了避免核心更改某些引數的值,可以通過這種方式手動將這些引數傳遞給核心。如果不使用啟動管理器,比如直接從bios或者把核心檔案用 cp zimage dev fd0 等方法直接從裝置啟動,就不...