說明:該流程圖按照**執行時間順序劃分為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處理器的統一...