色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

kernel的啟動分為哪兩個階段

麥辣雞腿堡 ? 來源:TrustZone ? 作者:Hcoco ? 2023-12-04 16:45 ? 次閱讀

kernel的啟動主要分為兩個階段。

1、階段一

從入口跳轉到start_kernel之前的階段。

對應代碼arch/arm/kernel/head.S中stext的實現:

ENTRY(stext)
  • 這個階段主要由匯編語言實現。
  • 這個階段主要負責MMU打開之前的一些操作,以及打開MMU的操作。
  • 由于這個階段MMU還沒有打開,并且kernel加載地址和連接地址并一致,所以需要使用位置無關設計。在運行過程中運行地址和加載地址一致(如果不明白的話建議先參考一下《[kernel 啟動流程] 前篇——vmlinux.lds分析》)。

(上一篇從uboot到kernel的地方,講了kernel啟動后的幾個階段,停在start_kernel部分)

2、階段二

start_kernel開始的階段。

正題-kernel-uboot

Android生在linux內核基礎上,linux內核啟動的最后一步,一定是啟動的android的進程。

然后我們也知道了內核啟動分為三個階段,

  • 第一二是運行head.S文件和head-common.S,
  • 第三個階段是允許第二是運行main.c文件。

對于ARM的處理器,內核第一個啟動的文件是arc/arm/kernel下面的head.S文件。、

當然arc/arm/boot/compress下面 也有這個文件,這個文件和上面的文件略有不同,當要生成壓縮的內核時zImage時, 啟動的是后者 ,后者與前者不同的是:它前面的代碼是做自解壓的,后面的代碼都相同。

我們這里這分析arc/arm/kernel下面的head.S文件。當head.S所作的工作完成后它會跳到init/目錄下跌的 main.c的start_kernel函數開始執行。

因為我們要研究的是過渡階段,而不是整個啟動流程。(后面會研究的。)這里直接看第三個--start_kernel階段。

asmlinkage void __init start_kernel(void)  
{  
       …………………….  
       ……………………..  
       printk(KERN_NOTICE);  
       printk(linux_banner);  
       setup_arch(&command_line);  
       setup_command_line(command_line);  


       parse_early_param();  
       parse_args("Booting kernel",static_command_line, __start___param,  
                __stop___param - __start___param,  
                &unknown_bootoption);  
……………………  
…………………………        
       init_IRQ();  
       pidhash_init();  
       init_timers();  
       hrtimers_init();  
       softirq_init();  
       timekeeping_init();  
       time_init();  
       profile_init();  
…………………………  
……………………………  
       console_init();  
………………………………  
………………………………  
       rest_init();  
}

從上面可以看出start_kernel首先是打印內核信息,然后對bootloader傳進來的一些參數進行處理,再接著執行各種各樣的初始化,在這其中會初始化控制臺。最后會調用rest_init();

我們再來看 rest_init ()函數

static void noinline __init_refok rest_init(void)  
    __releases(kernel_lock)  
{  
    int pid;  

    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);  
    ............      
}

他啟動了kernel_init這個函數,再來看kerne_init函數

static int __init kernel_init(void * unused)  
{  
    ..............................  

    if (!ramdisk_execute_command)  
        ramdisk_execute_command = "/init";  

    if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {  
        ramdisk_execute_command = NULL;  
        prepare_namespace();  
    }  

    /*  
     * Ok, we have completed the initial bootup, and  
     * we're essentially up and running. Get rid of the  
     * initmem segments and start the user-mode stuff..  
     */  
    init_post();  
    return 0;  
}

kernel_init先調用了 prepare_namespace() ;然后調用了init_post函數

void __init prepare_namespace(void)  
{  
    ..........................  
    mount_root();  
    .....................  
}

可以看出prepare_namespace調用了mount_root掛接根文件系統。接著kernel_init再執行init_post

static int noinline init_post(void)  
{  
    .......................................  
    /*打開dev/console控制臺,并設置為標準輸入、輸出*/  

    if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)  
        printk(KERN_WARNING "Warning: unable to open an initial console.n");  

    (void) sys_dup(0);  
    (void) sys_dup(0);  

    if (ramdisk_execute_command) {  
        run_init_process(ramdisk_execute_command);  
        printk(KERN_WARNING "Failed to execute %sn",  
                ramdisk_execute_command);  
    }  

    /*  
     * We try each of these until one succeeds.  
     *  
     * The Bourne shell can be used instead of init if we are  
     * trying to recover a really broken machine.  
     */  

    //如果bootloader指定了init參數,則啟動init參數指定的進程  
    if (execute_command) {  
        run_init_process(execute_command);  
        printk(KERN_WARNING "Failed to execute %s.  Attempting "  
                    "defaults...n", execute_command);  
    }  

    //如果沒有指定init參數,則分別帶sbin、etc、bin目錄下啟動init進程  
    run_init_process("/sbin/init");  
    run_init_process("/etc/init");  
    run_init_process("/bin/init");  
    run_init_process("/bin/sh");  

    panic("No init found.  Try passing init= option to kernel.");  
}

注意上面的run_init_process的會等待init進程返回才往后面執行,所有它一旦找到一個init可執行的文件它將一去不復返。

綜上,內核啟動的過程大致為以下幾步:

  • 1.檢查CPU和機器類型
  • 2.進行堆棧、MMU等其他程序運行關鍵的東西進行初始化
  • 3.打印內核信息
  • 4.執行各種模塊的初始化
  • 5.掛接根文件系統
  • 6.啟動第一個init進程
  • 7.android啟動
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3943

    瀏覽量

    127745
  • Linux
    +關注

    關注

    87

    文章

    11342

    瀏覽量

    210152
  • MMU
    MMU
    +關注

    關注

    0

    文章

    91

    瀏覽量

    18336
  • Kernel
    +關注

    關注

    0

    文章

    48

    瀏覽量

    11216
收藏 人收藏

    評論

    相關推薦

    求助,以下兩個ADC轉換的通道,分別是CC2541上的兩個引腳???

    #define HAL_ADC_CHN_TEMP 0x0e /* Temperature sensor */ #define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */ 以上兩個ADC轉換的通道,分別是CC2541上的
    發表于 01-14 08:15

    雙絞線分為

    `  誰知道雙絞線分為種?`
    發表于 12-31 15:53

    雙絞線分為

    `  誰來闡述一下雙絞線分為種?`
    發表于 03-16 17:03

    BootLoader啟動過程分為哪幾個階段

    BootLoarder是什么?BootLoader的操作模式有哪幾種呢?BootLoader啟動過程分為哪幾個階段呢?
    發表于 11-30 07:02

    技術分享|TQ3568如何更換啟動logo(包括uboot和kernel)

    TQ3568平臺的開機logo分為兩個階段,分別為u-boot 階段的logo 和內核階段的logo如果
    發表于 04-17 09:39

    倫敦區塊鏈銀行金融初創公司BABB啟動ICO 欲分兩個階段穩扎穩打

    服務。 據悉,BABB將會在1月15日開始預售,目前注冊工作已經開始,正式公開發售將會在下個月啟動。和絕大多數ICO不同,BABB計劃將本次ICO項目分為兩個階段,第二
    發表于 02-18 16:45 ?1202次閱讀

    兩個接觸器如何實現順序啟動

    今天小編給大家分享一電路,兩個電機順序啟動電路,這張圖是實物接線,我們可以看到兩個接觸器,一時間繼電器,
    的頭像 發表于 05-14 17:10 ?7815次閱讀

    兩個階段來看新能源電動汽車的發展前景

    新能源電動車的發展前景可以分為兩個階段來看。第1就是20年之內。第2階段是20年之后。在第
    發表于 10-23 08:58 ?2119次閱讀

    兩個變頻器不能啟動的故障處理案例分享

    本文通過兩個變頻器不能啟動的故障處理案例,和大家分享控制電路設計存在缺陷和變頻器參數設置不符合應用要求導致的變頻器不能啟動的原因和處理辦法以及從這些故障處理中總結的經驗。
    的頭像 發表于 11-01 11:04 ?5341次閱讀
    <b class='flag-5'>兩個</b>變頻器不能<b class='flag-5'>啟動</b>的故障處理案例分享

    光電編碼器分為

    光電編碼器分為種?
    的頭像 發表于 07-29 15:52 ?9803次閱讀

    兩個LED和兩個按鈕的使用

    電子發燒友網站提供《兩個LED和兩個按鈕的使用.zip》資料免費下載
    發表于 01-30 16:04 ?1次下載
    <b class='flag-5'>兩個</b>LED和<b class='flag-5'>兩個</b>按鈕的使用

    kernel到android核心啟動過程

    總結一圖:kernel 到android核心啟動過程 kernel鏡像執行跳轉到start_kernel開始執行,在rest_init會創
    的頭像 發表于 12-04 16:59 ?1112次閱讀
    <b class='flag-5'>kernel</b>到android核心<b class='flag-5'>啟動</b>過程

    uboot的啟動BL1和BL2兩個階段介紹

    之前對這個uboot的源碼了解有些許遺忘。最近做AVB校驗,需要uboot到kernel的這個過程。這里再復習一下。 與大多數BootLoader一樣,uboot的啟動過程分為BL1和BL2
    的頭像 發表于 12-04 17:53 ?3218次閱讀

    電磁繼電器分為兩個電路

    的控制。根據其結構和工作原理,電磁繼電器可以分為兩個電路:控制電路和工作電路。 一、控制電路 控制電路是電磁繼電器的重要組成部分,它的作用是提供電磁鐵所需的電流,使其產生磁場??刂齐娐分饕呻娫?、控制開關和
    的頭像 發表于 06-21 09:28 ?787次閱讀

    二極管的伏安特性分為兩個部分?

    二極管是一種半導體器件,具有單向導電性。其伏安特性是描述二極管在不同電壓下電流變化的曲線。二極管的伏安特性可以分為兩個部分:正向特性和反向特性。 正向特性 正向特性是指二極管在正向偏置下,即陽極接
    的頭像 發表于 08-16 11:16 ?988次閱讀
    主站蜘蛛池模板: 在线看免费毛片 | 欧美日韩国产高清综合二区 | 爆操日本美女 | 国产日韩高清一区二区三区 | 日韩亚洲不卡在线视频 | 东京热无码中文字幕av专区 | 欧美日韩国产码在线 | 公和我做好爽添厨房中文字幕 | 国产乱妇乱子在线播视频播放网站 | 色美妞论坛 | 国产伦精品一区二区三区 | 青草久久影院 | 久久人妻熟女中文字幕AV蜜芽 | 樱桃视频高清免费观看在线播放 | 亚洲精品无码专区在线播放 | 午夜伦理电影在线观免费 | 37大但人文艺术A级都市天气 | 男女作爱在线播放免费网页版观看 | 袖珍人与大黑人性视频 | 日本一区不卡在线播放视频免费 | 一本久道视频无线视频 | 欧美卡1卡2卡三卡2021精品 | 各种肉黄浪荡故事集 | 中文字幕在线视频观看 | 日韩欧美中文字幕在线 | 亚洲精品国产熟女久久久 | 男人J放进女人屁股免费观看 | 韩国黄色影院 | 国产爱豆果冻传媒在线观看视频 | 久久久久久久网 | 精品国产原创在线观看视频 | 國產日韓亞洲精品AV | 肉奴隷 赤坂丽在线播放 | 国产 精品 亚洲 欧美 高清 | 亚洲欧美综合在线中文 | 九九热这里都是精品 | x8国产精品视频 | 秋霞电影网午夜一级鲁丝片 | 中文无码乱人伦中文视频播放 | 琪琪伦伦影院理论片 | 色噜噜狠狠色综合中文字幕 |