Linux kernel之SMP初始化

01


linux

SMP數據結構
web

SMP的數據結構以下圖所示,主要由2部分構成,經過兩個宏定義CONFIG_SMP和CONFIG_HOT_PLUG來控制。當設置kernel支持SMP模式時,那麼CONFIG_SMP選項是必定會打開的,所以第一部分是必須實現的內容。而第二部分是否須要實現取決於熱插拔宏定義CONFIG_HOTPLUG_CPU是否打開。


CONFIG_SMP宏定義:


CONFIG_HOTPLUG_CPU宏定義:
微信



02網絡


數據結構

SMP初始化
app

  • smp_init_cpus

core0執行該函數實際上並不去設置硬件,這個函數經過SCUCONFIG(0x4)寄存器獲取當前SoC的core數量,預先初始化好一張cpu map的表,後期若除primary cpu以外的cpu真正被激活並設置爲SMP模式,那麼會再次更新cpu map這張表。

其實例化以下:

  • smp_prepares_cpus函數

core0執行完setup_arch後,在其初始化的最後部分調用,配置好SMP相關的SCU模塊。其中setup_max_cpus由內核配置選項NR_CPUS決定。flex

其實例化以下:url

  • smp_secondary_initspa

這個函數是SMP系統初始化過程當中惟一一個secondary core執行的代碼。它的執行時間點在core1解復位以後,由secondary_start_kernel()調用,一般會配置core1的電源模式等。

  • smp_boot_secondary

做爲開啓SMP系統的鑰匙函數,它是必定要實現的。由__cpu_up進行調用,設置core1解復位後要執行的第一條指令地址,使core1得以執行初始化代碼並最終進入到secondary_start_kernel()函數中。

對於每一個多核ARM SoC而言,這個函數使必定要實現的,其實例化的方式截然不同,均可以參考以下方式:

而core1執行的第一條指令符號是secondary_startup,一般的作法是將符號secondary_startup的絕對地址寫入SoC內部特定的寄存器,當core1被激活後,會自動跳轉到該寄存器所存的地址處進行取指。

至此,4個smp相關的初始化函數介紹完畢,如下爲kernel SMP的完整初始化流程。


推薦閱讀


【1】【從0學ARM】你不瞭解的ARM處理異常之道
【2】爲何使用結構體效率比較高? 必讀
【3】9. 基於Cortex-A9 LED彙編、C語言驅動編寫必讀
【4】一文包你學會網絡數據抓包必讀
【5】10. 基於Cortex-A9的pwm詳解 必讀
【6】11. 基於ARM Cortex-A9中斷詳解 必讀

 


 

進羣,請加一口君我的微信,帶你嵌入式入門進階。


本文分享自微信公衆號 - 一口Linux(yikoulinux)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索