Linux 2 6核心啟動傳遞命令列的過程分析

2021-07-07 04:52:01 字數 1587 閱讀 3058

核心在啟動時可以傳遞乙個字串命令列,來控制核心啟動的過程,例如:

"console=ttys2,115200 mem=64m@0xa0000000"

這裡指定了控制台是串列埠2,波特率是115200,記憶體大小是64m,物理基位址是0xa0000000。

另外我們可以在核心中定義一些全域性變數,使用這些全域性變數控制核心的配置,例如usb驅動中定義了

static int nousb; /* disable usb when built into kernel image */

這個變數為1,則整個usb驅動不初始化,如果想將其置1,可在字串命令列中新增nousb=1。

在操作該變數之前,還要讓系統知道該變數,方法是:

__module_param_call("",nousb,param_set_bool,param_get_bool,&nousb,0444);

__module_param_call這個巨集定義在kernel\include\linux\moduleparam.h

原型如下:

#define __module_param_call(prefix, name, set, get, arg, perm)   static char __param_str_##name = prefix #name;   static struct kernel_param const __param_##name    __attribute_used__          __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *))))  =

它定義了乙個kernel_param型別的變數,這個變數被放到了段__param,

kernel_param結構體的定義是:

struct kernel_param ;

__param這個段的宣告有些平台是在arch/../../vmlinux.lds.s,而大多數平台是放到

kernel\include\asm-generic\vmlinux.lds.h中,定義如下:

__param : at(addr(__param) - load_offset)

核心啟動時就會對字串命令進行解析,在kernel\init\main.c中,核心啟動函式start_kernel中

對外部陣列進行了宣告:

extern struct kernel_param __start___param, __stop___param;

然後呼叫函式parse_args對陣列進行解析:

parse_args("booting kernel", command_line, __start___param,

__stop___param - __start___param,

&unknown_bootoption);

其中command_line就是要解析的字串命令列,unknown_bootoption是函式指標,它用來獲取指定引數的=右邊的值。

parse_args就會在陣列中找到和nousb名稱一樣的kernel_param變數,並呼叫它的set函式對其進行付值。

Linux2 6核心啟動分析

我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...

linux2 6核心啟動流程

計算機在啟動時都是先加電,然後進行硬體檢測並引導作業系統的初始化程式,然後作業系統的初始化程式程負責讀入系統核心並建產系統的執行環境.一這過程相對來說比較復而且與cpu體系結構相關,這裡我們通過linux並以i386的體系結構對這一過程進行較為詳細的說明.一 硬體檢測 當 機器加電後它首先執行bio...

Linux 2 6核心編譯,核心公升級

本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...