新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM多核處理器啟動過程分析

        ARM多核處理器啟動過程分析

        作者: 時間:2016-11-10 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/317186.htm

        說明:

        該流程圖按照代碼執行時間順序劃分為4部分:

        1.Bootloader在圖片上半部,最先啟動;

        2.Kernel在圖片下半部,由bootloader引導啟動;

        3.CPU0執行流程在圖片左半部,bootloader代碼會進行判斷,先行啟動CPU0;

        4. Secondary CPUs在圖片右半部,由CPU喚醒

        具體啟動流程如下:

        1.在bootloader啟動時,會判斷執行代碼的是否為CPU0,如果不是,則執行wfe等待CPU0發出sev指令喚醒。如果是CPU0,則繼續進行初始化工作。

        mrs x4,mpidr_el1

        tst x4,#15//testwether the current cpu is CPU0, ie. mpidr_el1=15

        b.eq 2f

        /*

        * Secondary CPUs

        */

        1: wfe

        ldr x4, mbox

        cbz x4, 1b//if x4==0(ie. The value in address of mbox is 0) dead loop,or jump to x4

        br x4 // branch to thegiven address

        2:…… //UART initialisation (38400 8N1)

        以上mbox的地址在Makefile中寫定,是0x8000fff8,該地址處初始狀態內容為全0。上面代碼判斷,若mbox地址處內容為0,則死循環;如果不為0則直接跳轉到該地址所包含內容處執行。

        2.在dts中,對cpu-release-addr進行賦值,將其地址設為0x8000fff8。即只要往該地址寫入相應的值,例如地址A,并且發送sev指令,就能將次級CPU喚醒,并跳轉到A地址處執行。

        cpu-release-addr = <0x0 0x8000fff8>;

        3. 內核中smp_prepare_cpus 函數對0x8000fff8地址處內容進行了賦值,其值為函數secondary_holding_pen 的地址:

        release_addr = __va(cpu_release_addr[cpu]);

        release_addr[0] = (void*)__pa(secondary_holding_pen);//write function address to mbox

        以上代碼執行完后發送sev指令,喚醒其他次級CPU執行secondary_holding_pen函數:

        /*

        * Send an event to wake up the secondaries.

        */

        sev();

        4. secondary cpu 執行secondary_holding_pen()函數時都會去判斷當前CPU的ID,并與secondary_holding_pen_release變量做比對,如果相等,則執行進一步初始化,否則執行WFE等待;

        secondary_holding_pen_release變量的修改過程由CPU0調用smp_init()函數進行。該函數首先為相應CPU綁定一個idle線程,然后修改secondary_holding_pen_release的值(其值即CPU0欲喚醒的CPU的ID),最后發送sev指令,喚醒相應CPU執行idle線程。

        secondary_holding_pen()函數代碼如下:

        /*

        * This provides a"holding pen" for platforms to hold all secondary

        * cores are helduntil were ready for them to initialise.

        */

        ENTRY(secondary_holding_pen)

        bl el2_setup // Drop to EL1

        mrs x0, mpidr_el1

        and x0, x0, #15 // CPU number

        adr x1, 1b

        ldp x2, x3, [x1]

        sub x1, x1, x2

        add x3, x3, x1

        pen: ldr x4, [x3]

        cmp x4,x0

        b.eq secondary_startup

        wfe

        b pen

        ENDPROC(secondary_holding_pen)

        附錄:

        內核中啟動secondary cpus函數調用過程大致如下:

        start_kernel èrest_initèkernel_inièkernel_init_freeable èsmp_init() kernel/smp.c line 649, 由CPU0激活剩余的處理器

        cpu_upè_cpu_up()è__cpu_up ()èboot_secondary ()èwrite_pen_release該函數中有一句:secondary_holding_pen_release = val; 然后發送sev指令,激活剩余處理器。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 崇义县| 河津市| 梅州市| 吉水县| 嘉峪关市| 若羌县| 伊川县| 青川县| 灌阳县| 萝北县| 康保县| 金湖县| 东至县| 建昌县| 精河县| 麻江县| 滨州市| 昔阳县| 芷江| 阳新县| 凌海市| 敦煌市| 武城县| 富平县| 济源市| 迭部县| 涡阳县| 和田县| 安溪县| 普格县| 新营市| 肥东县| 习水县| 出国| 文成县| 垦利县| 新泰市| 苗栗县| 威信县| 连州市| 新宁县|