spin-table
spin-table啟動流程的示意圖如下:
芯片上電后primary cpu開始執(zhí)行啟動流程,而secondary cpu則將自身設(shè)置為WFE睡眠狀態(tài),并且為內(nèi)核準(zhǔn)備了一塊內(nèi)存,用于填寫secondary cpu的入口地址。
uboot負(fù)責(zé)將這塊內(nèi)存的地址寫入devicetree中,當(dāng)內(nèi)核初始化完成,需要啟動secondary cpu時,就將其內(nèi)核入口地址寫到那塊內(nèi)存中,然后喚醒cpu。
secondary cpu被喚醒后,檢查該內(nèi)存的內(nèi)容,確認(rèn)內(nèi)核已經(jīng)向其寫入了啟動地址,就跳轉(zhuǎn)到該地址執(zhí)行啟動流程。
secondary cpu初始化狀態(tài)設(shè)置
uboot啟動時,secondary cpu會通過以下流程進(jìn)入wfe狀態(tài)(arch/arm/cpu/armv8/start.S):
#if defined(CONFIG_ARMV8_SPIN_TABLE) && !defined(CONFIG_SPL_BUILD)
branch_if_master x0, x1, master_cpu (1)
b spin_table_secondary_jump (2)
…
master_cpu: (3)
bl _main
(1)若當(dāng)前cpu為primary cpu,則跳轉(zhuǎn)到step 3,繼續(xù)執(zhí)行啟動流程。其中cpu id是通過mpidr區(qū)分的,而啟動流程中哪個cpu作為primary cpu可以任意指定。當(dāng)指定完成后,此處就可以根據(jù)其身份確定相應(yīng)的執(zhí)行流程
(2)若當(dāng)前cpu為slave cpu,則執(zhí)行spin流程。它是由spin_table_secondary_jump函數(shù)實(shí)現(xiàn)的(arch/arm/cpu/armv8/start.S)。以下為其代碼實(shí)現(xiàn):
ENTRY(spin_table_secondary_jump)
.globl spin_table_reserve_begin
spin_table_reserve_begin:
0: wfe (1)
ldr x0, spin_table_cpu_release_addr (2)
cbz x0, 0b (3)
br x0 (4)
.globl spin_table_cpu_release_addr (5)
.align 3
spin_table_cpu_release_addr:
.quad 0
.globl spin_table_reserve_end
spin_table_reserve_end:
ENDPROC(spin_table_secondary_jump)
(1)secondary cpu當(dāng)前沒有事情要做,因此執(zhí)行wfe指令進(jìn)入睡眠模式,以降低功耗
(2)spin_table_cpu_release_addr將由uboot傳遞給內(nèi)核,根據(jù)step 5的定義可知,其長度為8個字節(jié),在64位系統(tǒng)中正好可以保存一個指針。而它的內(nèi)容在啟動時會被初始化為0,當(dāng)內(nèi)核初始化完成后,在啟動secondary cpu之前,會在uboot中將其入口地址寫到該位置,并喚醒它
(3)當(dāng)secondary cpu從wfe狀態(tài)喚醒后,會校驗(yàn)內(nèi)核是否在spin_table_cpu_release_addr處填寫了它的啟動入口。若未填寫,則其會繼續(xù)進(jìn)入wfe狀態(tài)
(4)若內(nèi)核填入了啟動地址,則其直接跳轉(zhuǎn)到該地址開始執(zhí)行內(nèi)核初始化流程
-
芯片
+關(guān)注
關(guān)注
455文章
50851瀏覽量
423980 -
cpu
+關(guān)注
關(guān)注
68文章
10870瀏覽量
211899 -
SMP
+關(guān)注
關(guān)注
0文章
74瀏覽量
19680
發(fā)布評論請先 登錄
相關(guān)推薦
手機(jī)模塊初始化向?qū)?/a>
FPGA的ROM初始化問題討論
![FPGA的ROM<b class='flag-5'>初始化</b>問題討論](https://file1.elecfans.com//web2/M00/A6/1E/wKgZomUMO9OAPVaAAAAO-JnSyf4661.jpg)
ROVA燒錄工具的應(yīng)用程序和注冊及初始化MCU說明和配置設(shè)置詳細(xì)概述
霍爾無刷電機(jī)如何進(jìn)行程序初始化?
【嵌入式07】寄存器映射原理詳解,GPIO端口的初始化設(shè)置步驟
![【嵌入式07】寄存器映射原理詳解,GPIO端口的<b class='flag-5'>初始化</b><b class='flag-5'>設(shè)置</b>步驟](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何在Segger J-Flash中設(shè)置芯片初始化序列?
什么是指定初始化?
復(fù)位電路如何回到初始化的狀態(tài)
![復(fù)位電路如何回到<b class='flag-5'>初始化</b>的<b class='flag-5'>狀態(tài)</b>](https://file.elecfans.com/web2/M00/AC/C7/poYBAGSNdPmAUM-8AABg-sWUXZQ967.png)
如何在內(nèi)核中啟動secondary cpu
![如何在內(nèi)核中啟動<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>](https://file1.elecfans.com/web2/M00/B4/70/wKgZomVu01iARkXLAAFbKxedE4Q782.jpg)
secondary cpu執(zhí)行流程介紹
![<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>執(zhí)行流程介紹](https://file1.elecfans.com/web2/M00/B2/AC/wKgaomVu2fmAClkMAAA1NRhU0B0814.jpg)
SMP多核secondary cpu啟動流程
![SMP多核<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>啟動流程](https://file1.elecfans.com/web2/M00/B2/B1/wKgaomVu7qGADZyPAAFcIeh24do321.jpg)
評論