亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Linux內(nèi)核啟動流程

原創(chuàng) 2016-11-09 13:38:16 514
摘要:編譯的內(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


發(fā)布手記

熱門詞條