摘要:編譯的內(nèi)核可能會很大,故這里可以壓縮一下。而在內(nèi)核文件中需要解壓,所以就會有一段自解壓代碼。在uboot啟動內(nèi)核的時候,調(diào)用了函數(shù): thekernel(0,MACH_ID,params_addr ) 0 存放在r0寄存器 MACH_ID 存放在r1 params_addr存放在r21. 首先處理uboot傳入的參數(shù)?! ~@取處理器id,查看內(nèi)核是否支持這個處理器CPU?! ~@取uboot傳
編譯的內(nèi)核可能會很大,故這里可以壓縮一下。而在內(nèi)核文件中需要解壓,所以就會有一段自解壓代碼。
在uboot啟動內(nèi)核的時候,調(diào)用了函數(shù): thekernel(0,MACH_ID,params_addr )
0 存放在r0寄存器
MACH_ID 存放在r1
params_addr存放在r2
1. 首先處理uboot傳入的參數(shù)。
獲取處理器id,查看內(nèi)核是否支持這個處理器CPU。
獲取uboot傳入的機器ID,查看內(nèi)核是否支持所運行該系統(tǒng)的單板。
建立一級頁表,使能mmu。
跳轉(zhuǎn)到start_kernel。內(nèi)核的第一個C函數(shù)。
處理傳入的啟動參數(shù)。
啟動參數(shù)包括: 內(nèi)存大小等。
start_kernel
setup_arch
setup_command_line
parse_early_param
do_early_param
從__setup_start到__setup_end調(diào)用函數(shù),使用方法如下:
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 //掛載根文件系統(tǒng)
init_post
//執(zhí)行運用程序
/* 打開“/dev/console”終端設(shè)備文件 */
/* 啟動execute_command定義的函數(shù) 一旦執(zhí)行,將做為第一個應(yīng)用程序,不會退出 */
/* 如果沒有以上函數(shù),將執(zhí)行 “/sbin/init” 函數(shù) */
/* /etc/init */
/* /bin/init */
/* 如果沒有以上的第一個應(yīng)用,則系統(tǒng)無法啟動 */
掛載根文件系統(tǒng)。
最終目的是運行應(yīng)用程序
busybox
/* parse_inittab 打開解析配置文件 /etc/inittab */
/* inittab格式 */
/* <id>:<runlevel>:<action>:<process> */
/* id 轉(zhuǎn)化為 /dev/id 用作終端
runlevels: 忽略
action : 執(zhí)行時機askfist sysinit等
process : 應(yīng)用程序或腳本
*/
new_init_action( action, command, cons )
創(chuàng)建一個action,并填寫結(jié)構(gòu)體
將這個結(jié)構(gòu)體放入init_action_list鏈表
運行鏈表中的函數(shù),創(chuàng)建為進程,并從鏈表中刪除。
構(gòu)造inittab
console ::askfirst:-/bin/sh
添加虛擬文件系統(tǒng)。
?。海簊ysinit:/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
執(zhí)行之后就能使用ps命令。
udev為自動創(chuàng)建到/dev/設(shè)備節(jié)點的簡化版本。
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 //支持熱插拔設(shè)備
mdev -s