編譯的核心可能會很大,故這裡可以壓縮一下。而在核心檔案中需要解壓,所以就會有一段自解壓程式碼。
在uboot啟動核心的時候,呼叫了函式: thekernel(0,MACH_ID,params_addr )
0 存放在r0暫存器
MACH_ID 存放在r1
params_addr存放在r2
1. 首先處理uboot傳入的引數。
獲取處理器id,檢視核心是否支援這個處理器CPU。
獲取uboot傳入的機器ID,檢視核心是否支援所執行該系統的單板。
建立一級頁表,使能mmu。
跳轉到start_kernel。核心的第一個C函式。
處理傳入的啟動引數。
啟動引數包括: 記憶體大小等。
start_kernel
setup_arch
setup_command_line
parse_early_param
do_early_param
從__setup_start到__setup_end呼叫函式,使用方法如下:
for (p = __setup_start; p < __setup_end; p++) {
if (p->early && strcmp(param, p->str) == 0) {
if (p->setup_func(val) != 0)
printk(KERN_WARNING
"Malformed early option '%s'\n", param);
}
unkown_bootption
reset_init
kernel_init
prepare_namespace
mount_root //掛載根檔案系統
init_post
//執行運用程式
/* 開啟“/dev/console”終端裝置檔案 */
/* 啟動execute_command定義的函式 一旦執行,將做為第一個應用程式,不會退出 */
/* 如果沒有以上函式,將執行 “/sbin/init” 函式 */
/* /etc/init */
/* /bin/init */
/* 如果沒有以上的第一個應用,則系統無法啟動 */
掛載根檔案系統。
最終目的是執行應用程式
busybox
/* parse_inittab 開啟解析配置檔案 /etc/inittab */
/* inittab格式 */
/* <id>:<runlevel>:<action>:<process> */
/* id 轉化為 /dev/id 用作終端
runlevels: 忽略
action : 執行時機askfist sysinit等
process : 應用程式或指令碼
*/
new_init_action( action, command, cons )
建立一個action,並填寫結構體
將這個結構體放入init_action_list連結串列
執行連結串列中的函式,建立為程序,並從連結串列中刪除。
構造inittab
console ::askfirst:-/bin/sh
新增虛擬檔案系統。
::sysinit:/etc/init.d/Rcs /*開機啟動指令碼*/
可將下面命令新增到rcs,開機可自己啟動mount -t proc none /proc
也能用mount -a /*依賴 /etc/fstab檔案 */
/etc/fstab檔案格式
device mount-option type options dump fsck order
proc /proc proc defaults 0 0
執行之後就能使用ps命令。
udev為自動建立到/dev/裝置節點的簡化版本。
mdev為udev的簡化版本。
在/etc/fstab中新增
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在rcs中新增
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug //支援熱插拔裝置
mdev -s