在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

kernel的啟動分為哪兩個(gè)階段

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

kernel的啟動主要分為兩個(gè)階段。

1、階段一

從入口跳轉(zhuǎn)到start_kernel之前的階段。

對應(yīng)代碼arch/arm/kernel/head.S中stext的實(shí)現(xiàn):

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

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

2、階段二

start_kernel開始的階段。

正題-kernel-uboot

Android生在linux內(nèi)核基礎(chǔ)上,linux內(nèi)核啟動的最后一步,一定是啟動的android的進(jìn)程。

然后我們也知道了內(nèi)核啟動分為三個(gè)階段,

  • 第一二是運(yùn)行head.S文件和head-common.S,
  • 第三個(gè)階段是允許第二是運(yùn)行main.c文件。

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

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

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

因?yàn)槲覀円芯康氖沁^渡階段,而不是整個(gè)啟動流程。(后面會研究的。)這里直接看第三個(gè)--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首先是打印內(nèi)核信息,然后對bootloader傳進(jìn)來的一些參數(shù)進(jìn)行處理,再接著執(zhí)行各種各樣的初始化,在這其中會初始化控制臺。最后會調(diào)用rest_init();

我們再來看 rest_init ()函數(shù)

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

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

他啟動了kernel_init這個(gè)函數(shù),再來看kerne_init函數(shù)

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先調(diào)用了 prepare_namespace() ;然后調(diào)用了init_post函數(shù)

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

可以看出prepare_namespace調(diào)用了mount_root掛接根文件系統(tǒng)。接著kernel_init再執(zhí)行init_post

static int noinline init_post(void)  
{  
    .......................................  
    /*打開dev/console控制臺,并設(shè)置為標(biāo)準(zhǔn)輸入、輸出*/  

    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參數(shù),則啟動init參數(shù)指定的進(jìn)程  
    if (execute_command) {  
        run_init_process(execute_command);  
        printk(KERN_WARNING "Failed to execute %s.  Attempting "  
                    "defaults...n", execute_command);  
    }  

    //如果沒有指定init參數(shù),則分別帶sbin、etc、bin目錄下啟動init進(jìn)程  
    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進(jìn)程返回才往后面執(zhí)行,所有它一旦找到一個(gè)init可執(zhí)行的文件它將一去不復(fù)返。

綜上,內(nèi)核啟動的過程大致為以下幾步:

  • 1.檢查CPU和機(jī)器類型
  • 2.進(jìn)行堆棧、MMU等其他程序運(yùn)行關(guān)鍵的東西進(jìn)行初始化
  • 3.打印內(nèi)核信息
  • 4.執(zhí)行各種模塊的初始化
  • 5.掛接根文件系統(tǒng)
  • 6.啟動第一個(gè)init進(jìn)程
  • 7.android啟動
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3958

    瀏覽量

    129076
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11403

    瀏覽量

    212074
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    18541
  • Kernel
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    11473
收藏 人收藏

    評論

    相關(guān)推薦

    求助,以下兩個(gè)ADC轉(zhuǎn)換的通道,分別是CC2541上的兩個(gè)引腳啊?

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

    雙絞線分為

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

    雙絞線分為

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

    BootLoader啟動過程分為哪幾個(gè)階段

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

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

    TQ3568平臺的開機(jī)logo分為兩個(gè)階段,分別為u-boot 階段的logo 和內(nèi)核階段的logo如果
    發(fā)表于 04-17 09:39

    倫敦區(qū)塊鏈銀行金融初創(chuàng)公司BABB啟動ICO 欲分兩個(gè)階段穩(wěn)扎穩(wěn)打

    服務(wù)。 據(jù)悉,BABB將會在1月15日開始預(yù)售,目前注冊工作已經(jīng)開始,正式公開發(fā)售將會在下個(gè)月啟動。和絕大多數(shù)ICO不同,BABB計(jì)劃將本次ICO項(xiàng)目分為兩個(gè)階段,第二
    發(fā)表于 02-18 16:45 ?1233次閱讀

    兩個(gè)接觸器如何實(shí)現(xiàn)順序啟動

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

    兩個(gè)階段來看新能源電動汽車的發(fā)展前景

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

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

    本文通過兩個(gè)變頻器不能啟動的故障處理案例,和大家分享控制電路設(shè)計(jì)存在缺陷和變頻器參數(shù)設(shè)置不符合應(yīng)用要求導(dǎo)致的變頻器不能啟動的原因和處理辦法以及從這些故障處理中總結(jié)的經(jīng)驗(yàn)。
    的頭像 發(fā)表于 11-01 11:04 ?5522次閱讀
    <b class='flag-5'>兩個(gè)</b>變頻器不能<b class='flag-5'>啟動</b>的故障處理案例分享

    光電編碼器分為

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

    兩個(gè)LED和兩個(gè)按鈕的使用

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

    kernel到android核心啟動過程

    總結(jié)一個(gè)圖:kernel 到android核心啟動過程 kernel鏡像執(zhí)行跳轉(zhuǎn)到start_kernel開始執(zhí)行,在rest_init會創(chuàng)
    的頭像 發(fā)表于 12-04 16:59 ?1320次閱讀
    <b class='flag-5'>kernel</b>到android核心<b class='flag-5'>啟動</b>過程

    uboot的啟動BL1和BL2兩個(gè)階段介紹

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

    電磁繼電器分為兩個(gè)電路

    的控制。根據(jù)其結(jié)構(gòu)和工作原理,電磁繼電器可以分為兩個(gè)電路:控制電路和工作電路。 一、控制電路 控制電路是電磁繼電器的重要組成部分,它的作用是提供電磁鐵所需的電流,使其產(chǎn)生磁場。控制電路主要由電源、控制開關(guān)和
    的頭像 發(fā)表于 06-21 09:28 ?1143次閱讀

    二極管的伏安特性分為兩個(gè)部分?

    二極管是一種半導(dǎo)體器件,具有單向?qū)щ娦浴F浞蔡匦允敲枋龆O管在不同電壓下電流變化的曲線。二極管的伏安特性可以分為兩個(gè)部分:正向特性和反向特性。 正向特性 正向特性是指二極管在正向偏置下,即陽極接
    的頭像 發(fā)表于 08-16 11:16 ?1339次閱讀
    主站蜘蛛池模板: 国产美女精品一区二区三区 | 狠狠干天天爱 | 午夜日韩精品 | 91中文在线观看 | 性夜影院爽黄a爽在线看香蕉 | 男女无遮挡一进一出性视频 | 午夜三级福利 | 嫩草影院入口一二三免费 | 情趣店上班h系列小说 | 小草影院亚洲私人影院 | 一 级 黄 中国色 片 | 毛片毛多 | 天天色天天碰 | 国产伦精品一区二区三区在线观看 | 天天免费| 国产网站黄 | 久久精品隔壁老王影院 | 国产精品久久久亚洲456 | 五月婷婷爱 | 中文字幕第8页 | 中年艳妇乱小玩 | 日韩在线三级视频 | 国产精品夜夜春夜夜爽久久 | 爽好舒服快受不了了老师 | 欧美大片一区二区三区 | 欧美巨大bbbb动漫 | 插插天天| 日韩在线三级视频 | 国产午夜一区二区在线观看 | 美女久久久久久 | 天天好比| 一级毛片在线看在线播放 | 婷婷色人阁 | 综合色综合 | free性欧美video69 | 开心激情五月网 | 日韩电影毛片 | 特黄特色大片免费视频播放 | 69日本人xxxxxxxx色 | 加勒比综合网 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 |