天天看點

Linux Kernel啟動中參數的處理

1. 在bootloader中會以taglist的形式存儲闆子mem、cmdline(cmdline中也可以定義mem資訊)等相關資訊,cmdline通過getenv從環境變量取得(該環境變量是之前使用setenv以字元串形式配置):addr和size。跳轉到kernel前,r0=0, r1=proc type, r2=tags pointer

2. kernel啟動首先會将r2寄存器的值(tags pointer)儲存到對應machine的mach info(mdesc->boot_params)中,然後在setup_arch中調用setup_machine取得tags的位址,并調用對應machine的fixup來初始化meminfo(mem bank的資訊);每種machine的mach_info靜态編譯在__proc_info_begin段中;關于cmdline的處理比較繞,每種tag都有對應的一種parse方式,以__tagtable(ATAG_CMDLINE, parse_tag_cmdline)形式聲明,在parse_tags中會按照tag類型parse,如果是ATAG_CMDLINE,在parse_tag_cmdline中,會将taglist傳遞過來的内容覆寫default_command_line。可是在我的版本核心setup_arch中調用parse_tags函數隻處理了ATAG_CORE,就是說cmdline始終是用的default值,為什麼?有待确認。

核心各參數分為兩種情況定義了處理方式,early_param和__setup,前者定義需要在其他參數處理前的參數處理函數,兩者分别最終分别在parse_early_param和parse_args進行解析,并調用各種參數的處理方式。在do_early_param中,通過__setup_start和__setup_end,它周遊了.init.setup段中的struct obs_kernel_param變量。如果p->early為真且為對應的選項字元串,則調用注冊的處理函數p->setup_func。

而__setup定義的參數處理在parse_args->unknown_bootoption->obsolete_checksetup中分析,這裡會調用__setup注冊的處理函數。

繼續閱讀