chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:Hcoco ? 2023-12-04 16:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1、階段一

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

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

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

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

2、階段二

start_kernel開(kāi)始的階段。

正題-kernel-uboot

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

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

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

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

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

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

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

我們?cè)賮?lái)看 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);  
    ............      
}

他啟動(dòng)了kernel_init這個(gè)函數(shù),再來(lái)看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)  
{  
    .......................................  
    /*打開(kāi)dev/console控制臺(tái),并設(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ù),則啟動(dòng)init參數(shù)指定的進(jìn)程  
    if (execute_command) {  
        run_init_process(execute_command);  
        printk(KERN_WARNING "Failed to execute %s.  Attempting "  
                    "defaults...n", execute_command);  
    }  

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

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

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

    關(guān)注

    12

    文章

    3989

    瀏覽量

    133181
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11635

    瀏覽量

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

    關(guān)注

    0

    文章

    92

    瀏覽量

    19122
  • Kernel
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    12007
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎ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

    雙絞線分為

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

    雙絞線分為

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

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

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

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

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

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

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

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

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

    兩個(gè)階段來(lái)看新能源電動(dòng)汽車(chē)的發(fā)展前景

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

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

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

    光電編碼器分為

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

    兩個(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核心啟動(dòng)過(guò)程

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

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

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

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

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

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

    二極管是一種半導(dǎo)體器件,具有單向?qū)щ娦?。其伏安特性是描述二極管在不同電壓下電流變化的曲線。二極管的伏安特性可以分為兩個(gè)部分:正向特性和反向特性。 正向特性 正向特性是指二極管在正向偏置下,即陽(yáng)極接
    的頭像 發(fā)表于 08-16 11:16 ?2492次閱讀