Linux核心啟動 setup arch

2021-09-08 21:56:00 字數 2647 閱讀 2155

bootloader 可以向linux 傳遞引數,編譯核心時也可以配置boot options 。

除錯中使用的u-boot bootargs如下:

noinitrd root=/dev/mtdblock3 rw console=ttysac0,115200 init=/linuxrc mem=64m

核心版本:

2.6.35.7

核心的處理引數的整體過程如下:

① u-boot將配置引數位址通過暫存器傳遞給核心 ②

核心(arch/arm/kernel/head-common.s中的 __mmap_switched)將這個位址存入__atags_pointer(定義於arch/arm/kernel/setup.c)

③ setup_arch() 函式

[html]view plain

copy

print?

<

span

style="font-size: 14px;"

>void __init setup_arch(char **cmdline_p)  

init_mm.start_code = (unsigned long) _text;  

init_mm.end_code   = (unsigned long) _etext;  

init_mm.end_data   = (unsigned long) _edata;  

init_mm.brk        = (unsigned long) _end;  

/* parse_early_param needs a boot_command_line */  

strlcpy(boot_command_line, from, command_line_size);         將defualt_command_line拷入boot_command_line  

/* populate cmd_line too for later use, preserving boot_command_line */  

strlcpy(cmd_line, boot_command_line, command_line_size);  

*cmdline_p = cmd_line;  

parse_early_param();               大部分引數的early屬性為0,即大部分引數在早期不處理,如noinitrd,console等  

paging_init(mdesc);  

request_standard_resources(&meminfo, mdesc);  

***************  

span

>

}  

void __init setup_arch(char **cmdline_p)

init_mm.start_code = (unsigned long) _text;

init_mm.end_code = (unsigned long) _etext;

init_mm.end_data = (unsigned long) _edata;

init_mm.brk = (unsigned long) _end;

/* parse_early_param needs a boot_command_line */

strlcpy(boot_command_line, from, command_line_size); 將defualt_command_line拷入boot_command_line

/* populate cmd_line too for later use, preserving boot_command_line */

strlcpy(cmd_line, boot_command_line, command_line_size);

*cmdline_p = cmd_line;

parse_early_param(); 大部分引數的early屬性為0,即大部分引數在早期不處理,如noinitrd,console等

paging_init(mdesc);

request_standard_resources(&meminfo, mdesc);

***************

}

一.u-boot傳遞tag到kernel的解析

在setup_arch函式的parse_tags中對傳遞過來的taglist進行了解析

對每一項的tag使用parse_tag分析,

for (t = &__tagtable_begin; t < &__tagtable_end; t++)

if (tag->hdr.tag == t->tag)

#define __tag __userd __attribute__((__section__(「.taglist.init」)))

對於上述巨集中的fn,就是tagtable結構中的parse指標所指向的函式。

而在setup.c中,已經通過__tagtalbe(atag_***,***)建立起所有可能的tagtable,所以可以通過遍歷__tagtable_begin~__tagtable_end找到對應的tagtable,並呼叫對應的parse進行解析並配置

linux 核心 核心啟動流程

cs是 段暫存器,ip是指令指標暫存器 相當於偏移位址 儲存的是 指令的位址。cs ip共同作用生成了 位址,具體演算法是cs左移4位 ip即是 位址。例如cs 0xf000,ip 0xfff0,則 位址為0xffff0.global globl 命令 global symbol global 使得...

linux核心啟動流程

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

讀Kernel感悟 Linux核心啟動 核心解壓縮

這得從vmliux.bin的產生過程說起。從核心的生成過程來看核心的鏈結主要有三步 第一步是把核心的源 編譯成.o檔案,然後鏈結,這一步,鏈結的是arch i386 kernel head.s,生成的是vmlinux。注意的是這裡的所有變數位址都是32位頁定址方式的保護模式下的虛擬位址。通常在3g以...