在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ATF(TF-A)代碼的剖析

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-06-23 10:27 ? 次閱讀

思考:

1、 SOC一上電,只有一個核啟動,還是所有核都啟動?

2、如果SOC一上電,如果只有一個核啟動,那么從核啟動的時候,從核的入口是哪里?

3、啥是cold boot?啥時warm boot? 在哪些場景下會使用warm boot?4、啥是cold reset/warm reset/primary boot/senondary boot?

說明:

1、本文以為armv8-aarch64、armv9為例、TF-A代碼為例,不討論其它硬件架構和固件軟件中的設計。

2、重點講述cold reset/warm reset/primary boot/senondary boot之間的流程和概念。

1、基礎概念

請先自行理解以下4個概念:

  • cold boot

  • warm boot

  • Primary boot

  • Secondary boot

另外還兩種配置:

  • 你的reset地址是可編程的,則會配置PROGRAMMABLE_RESET_ADDRESS=1,與之對立的則是你的reset地址是不可編程的。

  • 你在SOC啟動的時候,首先只啟動一個core,則會配置COLD_BOOT_SINGLE_CPU=1,與之對立的則是你的SOC啟動的時候,所有core都上電了。

2、啟動流程

我們就假定 reset地址是可編程的、SOC啟動的時候只啟動一個core,來講解我們的boot流程:

(1)、SOC一上電,SOC給ARM Core的signal configuration會改變RVBAR_EL3,這里一般就是就是bootrom的首地址。即CPU一上電,Primary core的PC指向的就是RVBAR_EL3的地址,機器就開始啟動了。

(2)、當需要Secondary Core啟動的時候,例如會走PSCI協議,【主核】進入ATF會將bl31_warm_entrypoint(或平臺自定義的地址)寫入到SOC寄存器,改變reset地址(改變RVBAR_EL3的值),然后此時SOC的PMIC給Secondary Core上電,此時Secondary Core也就發生了cold reset,PC從RVBAR_EL3(bl31_warm_entrypoint或平臺自定義函數)處開始執行.

總結(針對本文示例情況:reset地址是可編程的、cold boot的時候只啟動一個cpu):

  • 開機一上電只有Primary Core再跑,從RVBAR_EL3處開始跑,屬于cold boot

  • 從核啟動時,會修改reset的值,影響到RVBAR_EL3的值,然后給從核上電,此時屬于Secondary boot,仍然是cold boot.

  • 一般會將bl31_warm_entrypoint設置為reset地址,即Secondary Core的啟動地址;

  • 這個示例中沒有用到warm boot

3、ATF(TF-A)代碼的剖析

以BL1代碼為例分析,該代碼適配支持cold reset/warm reset/primary boot/senondary boot等諸多場景。

c8e8583c-f288-11ec-ba43-dac502259ad0.png

  • 如果reset是可編程的,PROGRAMMABLE_RESET_ADDRESS=1, 則_warm_boot_mailbox=0,則下面這段代碼不會被編譯,無論cold boot還是warm boot都不會走_warm_boot_mailbox

  • 如果reset是可編程的,PROGRAMMABLE_RESET_ADDRESS=0, 則_warm_boot_mailbox=1,則下面這段代碼會被編譯,但cold boot走do_cold_boot流程,warm boot需要走br x0流程


	
  1. .if \_warm_boot_mailbox

  2. /* -------------------------------------------------------------

  3. * This code will be executed for both warm and cold resets.

  4. * Now is the time to distinguish between the two.

  5. * Query the platform entrypoint address and if it is not zero

  6. * then it means it is a warm boot so jump to this address.

  7. * -------------------------------------------------------------

  8. */

  9. bl plat_get_my_entrypoint

  10. cbz x0, do_cold_boot

  11. br x0

  12. do_cold_boot:

  13. .endif /* _warm_boot_mailbox */

  • 如果SOC啟動的時候只啟動一個core,COLD_BOOT_SINGLE_CPU=1_secondary_cold_boot=0,則下面代碼不被編譯, 則無論主核還是從核都不需要走_secondary_cold_boot流程

  • 如果SOC啟動的時候啟動多個core,COLD_BOOT_SINGLE_CPU=0_secondary_cold_boot=1, 則下面代碼會被編譯,則主核走do_primary_cold_boot流程, 從核需要走plat_secondary_cold_boot_setup流程


	
  1. .if \_secondary_cold_boot

  2. /* -------------------------------------------------------------

  3. * Check if this is a primary or secondary CPU cold boot.

  4. * The primary CPU will set up the platform while the

  5. * secondaries are placed in a platform-specific state until the

  6. * primary CPU performs the necessary actions to bring them out

  7. * of that state and allows entry into the OS.

  8. * -------------------------------------------------------------

  9. */

  10. bl plat_is_my_cpu_primary

  11. cbnz w0, do_primary_cold_boot

  12. /* This is a cold boot on a secondary CPU */

  13. bl plat_secondary_cold_boot_setup

  14. /* plat_secondary_cold_boot_setup() is not supposed to return */

  15. bl el3_panic

  16. do_primary_cold_boot:

根據以上的代碼規則,這里也畫了兩張圖:

(1)、BL2 at EL3的場景

c8fe1f5a-f288-11ec-ba43-dac502259ad0.png

(2)、BL2 at S-EL1的場景

c922fc4e-f288-11ec-ba43-dac502259ad0.png

4、軟件如何判斷當前是cold reset/warm reset/primary boot/senondary boot

TF-A中定義了多核的啟動框架,如上一節框圖所示,在啟動的過程中會進行一些判斷,是cold reset還是warm reset,是primary boot還是secondary boot?那么代碼中是怎么知道這些狀態的呢?

4.1 cold reset和warm reset

這種判斷方法由平臺實現,其實就是讀取mailbox的值。

在第一個核cold boot時,會寫mailbox內存(magic,entrypoint...)在第二個核啟動時、或第一個核再次啟動時(有可能是resume喚醒時),會讀取mailbox內存,如果讀取到了符合期望的magic的值,則走warm流程,否則走cold流程。注意這里所說的warm流程,只是軟件上的warm流程,并非說當前是warm reset。

4.2 primary boot和secondary boot

這種判斷方法由平臺實現,看似也很簡單,一般而言就說讀取mpidr寄存器進行判斷。


	
  1. (trusted-firmware-a/plat/marvell/armada/a8k/common/aarch64/plat_helpers.S)

  2. func plat_is_my_cpu_primary

  3. mrs x0, mpidr_el1

  4. and x0, x0,

    #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)

  5. cmp x0, #MVEBU_PRIMARY_CPU

  6. cset w0, eq

  7. ret

  8. endfunc plat_is_my_cpu_primary

5、mailbox的介紹

5.1 mailbox是什么

mailbox就說一塊內存,所有的core都能訪問這塊內存。第一次啟動時,core會填充mailbox,將其下次resume時的地址、secondary core的啟動地址、warm reset的地址寫入到mailbox內存中,這幾個地址其實是一個地址。同時也會將這個地址寫入到SOC PMIC寄存器中,影響到RVBAR_EL3的值。

當SOC一上電所有core都啟動的這種情況下,主核會繼續跑,從核會在SOC一上電就進入wfi狀態。當從核需要繼續啟動時,該core從BL1 BL2 BL31正常流程啟動時,會在BL1、BL2 at EL3、BL31中,強制跳轉到mailbox的地址,跳過主核已經初始化的部分;

當SOC一上電,只有一個core上電的情況下,主核繼續跑,從核未上電。當從核需要啟動時,相當于cold reset,從核會直接從RVBAR_EL3處開始跑,也就是你設置的entrypoint。

5.2 mailbox的作用

mailbox中定義了entrypoint地址,當core從BL1 BL2 BL31正常流程啟動時,會在BL1、BL2 at EL3、BL31中,強制跳轉到mailbox的地址,以跳過已初始化的部分。

c933e6da-f288-11ec-ba43-dac502259ad0.png

5.3 mailbox的示例

其實就是定義了一塊內存,主核第一次跑時,會填充該內存。主核第二次跑時或從和跑時,檢測該內存已經填充過了,則走warm啟動流程,即強制跳轉到mailbox中的address地址。

c94561b2-f288-11ec-ba43-dac502259ad0.png

6、具體場景的總結

  • 串口中斷中敲擊reboot命令、或系統panic時導致的機器重啟:在一些的SOC廠商設計中,應該是code reboot。比如在Linux Kernel中敲擊reboot,到底層還是寫的一些寄存器控制pmic(或PMU),直接給cpu下電了。然后再上電,SOC還是會給Core發送signal configuration,此時RVBAR_EL3又會變成ASIC設置的值.

  • Suspend和Resume:比如我在看ATF中的海思平臺,在ATF的suspend函數,將bl31_warm_entrypoint地址寫入到了SOC PMIC的一個寄存器中(上電時,該寄存器會影響的是RVBARADDR信號)。此時系統深睡的時候,應該是Linux Kernel調用到ATF,將bl31_warm_entrypoint地址寫入到了pmu/pmic相關的寄存器中,在下一次reset時,會影響到signal configuration繼而改變RVBAR_EL3的值。然后還會給各個模塊下電(給哪些模塊下電是SOC的設計和邏輯),最后再給ARM Core下電, 這就算是深睡了。Resume的時候,也是有一些SOC的硬件行為,然后再給Core上電,那給Core上電后,一上電執行的是哪里?

    PC還是指向RVBAR_EL3中的地址,當然這是我們suspend的時候更改過的,其實就是bl31_warm_entrypoint

  • RMR_EL3:本文中都沒有提到RMR_EL3。那么RMREL3是干啥的呢?這是ARM的一個feature,怎么用?是你自己的設計,隨便你。你寫RMR_EL3中的bit,就可以觸發warm reset. 一般的kernel dump、或者一些工具,就可以主動觸發RMR_EL3,然后去干一些活. 還有在csdn上看到一篇高通soc的啟動流程的博客,他們正常的啟動流程中,某一個鏡像跳轉到另外一個鏡像時,竟然就是寫了一些RMR_EL3,觸發warm_reset,另外一個鏡像的地址恰好就是warm reset的跳轉地址。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • soc
    soc
    +關注

    關注

    38

    文章

    4190

    瀏覽量

    218624
  • 架構
    +關注

    關注

    1

    文章

    517

    瀏覽量

    25505

原文標題:SOC的多核啟動流程詳解

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    tf卡與云存儲的比較 tf卡的兼容性問題

    TF卡(通常指Micro SD卡)與云存儲在數據存儲領域各有其特點和優勢,同時也存在一些差異。以下是兩者之間的比較,以及關于TF卡兼容性問題的分析: 一、TF卡與云存儲的比較 數據存儲方式 :
    的頭像 發表于 12-19 15:24 ?503次閱讀

    tf卡存儲容量選擇 tf卡的常見故障及解決方法

    TF卡存儲容量選擇 TF卡(TransFlash卡)是一種小型的存儲卡,廣泛應用于手機、相機、平板電腦等便攜式設備中。選擇合適的TF卡存儲容量,需要考慮以下幾個因素: 設備兼容性 :首先,需要確認你
    的頭像 發表于 12-19 15:20 ?589次閱讀

    TF卡的安全性與加密技術

    隨著數字時代的到來,數據安全成為了一個不可忽視的問題。TF卡(TransFlash卡,也稱為MicroSD卡)作為一種便攜式存儲設備,廣泛應用于手機、相機、平板電腦等設備中。TF卡的安全性和加
    的頭像 發表于 11-04 09:58 ?1183次閱讀

    使用TF卡的常見問題

    隨著科技的發展,TF卡(TransFlash卡,也稱為MicroSD卡)已經成為我們日常生活中不可或缺的存儲工具。它們被廣泛應用于智能手機、平板電腦、數碼相機等設備中,用于擴展存儲空間,存儲照片
    的頭像 發表于 11-04 09:54 ?1350次閱讀

    TF卡使用注意事項

    隨著科技的發展,TF卡因其體積小、容量大、價格低廉等優點,已成為我們日常生活中不可或缺的存儲工具。然而,在使用過程中,如果不注意一些細節,可能會導致數據丟失、TF卡損壞等問題。 1. 選擇合適的TF
    的頭像 發表于 11-04 09:53 ?582次閱讀

    TF卡適用于哪些設備

    TF卡以其小巧的體積和大容量存儲的特點,被廣泛應用于各種便攜式電子設備中。隨著技術的不斷進步,TF卡的容量也在不斷增加,從最初的128MB到現在的2TB甚至更高,滿足了不同用戶對存儲空間的需求。TF
    的頭像 發表于 11-04 09:52 ?1285次閱讀

    TF卡與SD卡的區別

    在數字時代,存儲卡成為了我們生活中不可或缺的一部分。無論是手機、相機還是平板電腦,都需要存儲卡來擴展存儲空間。TF卡和SD卡是兩種市面上最常見的存儲卡類型,它們在功能和應用上有著各自的特點和優勢
    的頭像 發表于 11-04 09:50 ?461次閱讀

    AI編譯器技術剖析

    隨著人工智能技術的飛速發展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執行的代碼,還融入了人工智能技術,實現了自動化、智能化的編譯過程。本文將從AI編譯器的原理、技術特點、應用場景以及實例
    的頭像 發表于 07-17 18:28 ?1695次閱讀

    stm32mp157編譯燒錄運行到uboot串口無輸出怎么解決?

    1.大概2月前后,參考第2部分的方法,生成sdcard鏡像文件并燒錄的步驟,生成了sdcard鏡像文件并燒錄到sd卡,然后我一直使用這個sd卡和生成sdcard鏡像文件更新自己編譯的tf-a
    發表于 07-05 08:11

    什么是貼片式TF卡?

    貼片式TF卡,也被稱為貼片式SD卡或SD NAND,是一種可以直接貼裝在電路板上的存儲芯片。與傳統的插拔式TF卡不同,貼片式TF卡采用BGA(球柵陣列)封裝技術,使其可以通過回流焊接工藝直接貼裝在電子設備的主板上。這種設計不僅提
    的頭像 發表于 05-31 10:55 ?1231次閱讀
    什么是貼片式<b class='flag-5'>TF</b>卡?

    如何使用Yocto更新已更改的TF-A設備樹來產生新的鏡像文件?

    求助大佬, 我用Yocto構建了STM32MP157的鏡像文件,但我需要更改和移植TF-A和U-BOOT來適配我的板子, 我按照它正點原子教程里更改了.bl2和創建了新的.dtsi設備樹文件,但
    發表于 03-29 08:01

    stm32mp157d主頻為什么無法達到800mhz?

    我在移植tf-a 2.6 版本和uboot 2021.10 版本后發現mpu主頻是650mhz ,我的芯片是mp157d的型號應該是要跑到800mhz的,移植測試用的開發板用的是分離式電源,沒有采用
    發表于 03-20 06:02

    tf卡是什么卡 tf卡和內存卡一樣嗎

    TF卡,也被稱為T-Flash卡或TransFlash卡,是一種存儲卡,被廣泛應用于移動設備和數字產品中。它是以小尺寸、高容量和高速率讀寫的特點而著名,逐漸替代了舊式的存儲卡型號。雖然有些相似之處
    的頭像 發表于 02-01 14:06 ?9639次閱讀

    TF卡在心電監測儀中的多功能應用

    TF卡在心電監測儀中的應用 TF卡(Micro SD卡)在心電儀器上的應用主要是用作存儲設備,用于保存心電信號數據和其他相關信息。以下是TF卡在心電儀器上的一些常見應用: 1、數據存儲: TF
    的頭像 發表于 01-29 16:42 ?530次閱讀
    <b class='flag-5'>TF</b>卡在心電監測儀中的多功能應用

    TF卡和SD卡的區別有哪些?

    TF卡和SD卡在物理尺寸和一些應用領域上存在差異,但在技術規格上,特別是MicroSD卡,它們之間的差異相對較小。選擇TF卡還是SD卡通常取決于設備的兼容性和用戶的需求。
    的頭像 發表于 01-18 09:17 ?1.1w次閱讀
    <b class='flag-5'>TF</b>卡和SD卡的區別有哪些?
    主站蜘蛛池模板: 国产小视频在线观看www| 色综合久久综精品| 丁香视频在线| bt天堂在线最新版在线| 69久久| 99视频全部免费| 六九视频在线观看| 久久噜噜噜久久亚洲va久| 久久性久久性久久久爽| 国产片91人成在线观看| 1024人成网站色| 色资源网| avt天堂网| 色偷偷亚洲综合网亚洲| 一级特黄aa大片免费播放视频| 亚洲一卡2卡3卡4卡5卡乱码| 日本不卡专区| 夜色伊人| 日本黄色大片免费观看| 久久久久久久国产视频| www.色五月.com| 欧美影院| 国产黄色在线视频| 欧美性黄色| 亚洲欧美成人| 伊人成综合| 日韩毛片视频| 国产三级a三级三级天天| 午夜国产福利| 国产偷啪视频一区| 亚洲二区视频| 午夜片在线| 免费在线观看a| 躁天天躁中文字幕在线| 国产午夜三区视频在线| 深点再深一点好爽好多水| 婷婷97狠狠的狠狠的爱| 久久综合久| 午夜精品免费| 欧美毛片网站| 亚洲 欧美 精品专区 极品|