亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3231 | 回復(fù): 0
打印 上一主題 下一主題

[Zwinger] Linux Command Line 分析 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-02-22 16:53 |只看該作者 |倒序?yàn)g覽

本文原創(chuàng),轉(zhuǎn)貼請注明出處,謝謝!
本文分析對象: arm linux 2.6.29

0 處理模型
Linux kernel的啟動包括很多組件的初始化和相關(guān)配置,這些配置參數(shù)一般是通過command line進(jìn)行配置的。在進(jìn)行后續(xù)分析之前,先來理解一下command line的處理模型:
要處理的對象是一個(gè)字符串,其中包含了各種配置信息,通常各個(gè)配置之間通過空格進(jìn)行分離,每個(gè)配置的表達(dá)形式是如:param=value1,value2 或者很簡單就是一個(gè)rw。
那么kernel就需要提供對這些參數(shù)進(jìn)行處理的處理函數(shù)列表。根據(jù)參數(shù)的作用以及執(zhí)行期的先后不同,這些處理函數(shù)被定義到不同的段中。針對每一個(gè)參數(shù),Kernel都會到相應(yīng)的段中查找相應(yīng)的處理函數(shù),最終進(jìn)行各個(gè)組件的配置。
1 配置格式
常見的配置格式如:

console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs initrd=0x10800000,0x14af47

2 配置方式
2.1 Bootloader動態(tài)配置
由bootloader進(jìn)行參數(shù)配置,command line將做為atag_list的一個(gè)節(jié)點(diǎn)傳遞到Kernel。
2.2 Kernel靜態(tài)配置
通過make menuconfig進(jìn)行配置:運(yùn)行后配置boot options->Default kernel command string。該配置將被靜態(tài)編譯到Kernel中,通過變量default_command_line訪問。
3  解析配置
3.1 相關(guān)定義
根據(jù)執(zhí)行的先后順序,可以將處理函數(shù)分為三個(gè)大類,他們分別存在于下面三個(gè)段中(參考top/arch/arm/kernel/vmlinux.lds):

__setup_start = .; *(.init.setup) __setup_end = .;

__early_begin = .; *(.early_param.init) __early_end = .;

__start___param = .; *(__param) __stop___param = .;

這三個(gè)段內(nèi)存儲的不是參數(shù),而是command line參數(shù)所需要的處理函數(shù)。
3.1.1 .early_param.init段
“.early_param.init”所定義的處理相對靠前一些,它所處理的參數(shù)例如:initrd=,cachepolicy=,nocache, nowb, ecc=, vmalloc=, mem=,等等。
這些處理函數(shù)是通過__early_param宏來定義的,例如:
static void __init early_initrd(char **p)
{ …… }
__early_param("initrd=", early_initrd);
對于宏__early_param,可以在top/arch/arm/include/asm/Setup.h中找到如下定義:

struct early_params {
    const char *arg;
    void (*fn)(char **p);
};
#define __early_param(name,fn) \
static struct early_params __early_##fn __used \
__attribute__((__section__(".early_param.init"))) = { name, fn }


3.1.2 .init.setup

“.init.setup”定義的處理則要靠后一些,它所處理的參數(shù)例如:nfsroot=, ip=,等等。
這些處理函數(shù)是通過__setup宏來定義的,例如:

static int __init nfs_root_setup(char *line)
{ …… }
__setup("nfsroot=", nfs_root_setup);

對于宏__setup,可以在top/include/linux/Init.h中看到:

#define __setup_param(str, unique_id, fn, early) \
    static char __setup_str_##unique_id[] __initdata __aligned(1) = str; \
    static struct obs_kernel_param __setup_##unique_id \
           __used __section(.init.setup) \
           __attribute__((aligned((sizeof(long))))) \
           = { __setup_str_##unique_id, fn, early }
#define __setup(str, fn) \
    __setup_param(str, fn, fn, 0)
/* NOTE: fn is as per module_param, not __setup! Emits warning if fn
* returns non-zero. */
#define early_param(str, fn) \
    __setup_param(str, fn, fn, 1)

注意看的話,可以看到還有一個(gè)宏 early_param,它與宏__setup的定義相似,只不過最后一個(gè)宏參數(shù)是1而不是0。1表示需要提前處理的參數(shù)。
3.1.3  __param段
這個(gè)段中保存的是build-in類型module的配置參數(shù)。該宏直接用來修飾需要的變量。
3.2  解析
3.2.1 相關(guān)變量
相關(guān)的變量包括:
default_command_line
保存memuconfig配置的參數(shù),如果bootloader傳入了命令行參數(shù),那么這個(gè)新的配置將被更新到該變量中。
boot_command_line
存在于.init.data段。最初是default_command_line的拷貝。
command_line
存在于.init.data段。在parse_cmdline()中被賦值,數(shù)據(jù)來源是default_command_line。
saved_command_line
用于保存沒有處理過的命令行參數(shù),是boot_caommand_line的拷貝。
static_command_line
是command_line的拷貝。
3.2.2 主要函數(shù)
函數(shù)名稱:parse_cmdline()
操作數(shù)據(jù):default_command_line
函數(shù)列表:.early_param.init段(在__early_begin和__early_end之間)。
函數(shù)功能:依據(jù)函數(shù)列表對default_command_line中的參數(shù)進(jìn)行處理。


函數(shù)名稱:parse_early_param()
操作數(shù)據(jù):boot_command_line
函數(shù)列表:.init.setup段中(__setup_start和__setup_end之間),主要是通過宏early_param定義的部分。
函數(shù)功能:依據(jù)函數(shù)列表對boot_command_line中的參數(shù)進(jìn)行處理。
注意parse_one()的第四個(gè)入?yún)⑹?,而且第五個(gè)參數(shù)是NULL。這里沒有給出參數(shù)隊(duì)列,不會對boot_command_line的每個(gè)參數(shù)在參數(shù)隊(duì)列中進(jìn)行對比查找,而是直接在do_early_param()中進(jìn)行條件判斷,如果滿足下面的條件,那么對該參數(shù)進(jìn)行對應(yīng)的操作:

if ((p->early && strcmp(param, p->str) == 0) ||
                  (strcmp(param, "console") == 0 &&
                   strcmp(p->str, "earlycon") == 0)
              )


函數(shù)名稱:parse_args()
操作數(shù)據(jù):static_command_line。
函數(shù)列表:__param段(__start___param和__stop___param之間)。
函數(shù)功能:該操作將依據(jù)函數(shù)列表,對static_command_line中的參數(shù)進(jìn)行相應(yīng)的操作。這個(gè)操作在parse_one()的第一部分代碼完成:

for (i = 0; i

接下來對于不被這個(gè)列表所支持的參數(shù),將在unknown_bootoption()中進(jìn)行處理。在unknown_bootoption()中主要是obsolete_checksetup()的操作。


函數(shù)名稱:obsolete_checksetup()
操作數(shù)據(jù):static_command_line。
函數(shù)列表:.init.setup段中(__setup_start和__setup_end之間),主要是通過宏__setup定義的部分。
函數(shù)功能:該操作將依據(jù)函數(shù)列表,對static_command_line中的參數(shù)進(jìn)行相應(yīng)的操作。如果是在parse_early_param()中已經(jīng)處理的操作,那么這里不再處理;如果是查找到的條目中沒有操作函數(shù),那么這表示是過時(shí)的數(shù)據(jù)定義(有些早期的代碼,沒有定義這個(gè)函數(shù));如果不是以上兩種情形,那么利用找到的函數(shù)對參數(shù)進(jìn)行處理。
3.2.3 圖示




本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/111928/showart_2184040.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP