編譯的核心可能會很大,故這裡可以壓縮一下。而在核心檔案中需要解壓,所以就會有一段自解壓程式碼。

在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