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

2021-06-22 07:19:21 字數 2528 閱讀 6333

說明:該流程圖按照**執行時間順序劃分為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>; 

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 we're 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

wfeb       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指令,啟用剩餘處理器。

arm 多核處理器啟動

說明 該流程圖按照 執行時間順序劃分為4部分 1.bootloader在上半部,最先啟動 2.kernel在下半部,由bootloader引導啟動 3 cpu0執行流程在左半部,bootloader 會進行判斷,先行啟動cpu0 4.secondary cpus在右半部,由cpu喚醒 具體啟動流程如...

ARM啟動過程分析

啟動 所謂的啟動 就是在啟動的時候執行的一段 主要任務是初始化處理器模式,設定堆疊,初始化變數等等。由於以上的操作均與處理器架構和系統配置密切相關,所有一般由彙編來編寫。啟動 一般分為兩部分,一是與arm7核心相關的部分,包括處理器各異常向量的配置,各處理器模式的堆疊設定,如果有必要,複製向量到ra...

arm處理器啟動流程分析

2440 啟動方式 nor nand 啟動流程 開發板在上電後,會從0x0位址處執行。如果從nor flash啟動,則 要放在nor 的0位址處 如果從nand flash啟動,nand flash是不能直接訪問的,必須通過相應的暫存器才能訪問到,所以nand flash 不能參與arm處理器的統一...