Linux kernel之SMP初始化
01
—
SMP數據結構
SMP的數據結構如下圖所示,主要由2部分構成,通過兩個宏定義CONFIG_SMP和CONFIG_HOT_PLUG來控制。當設置kernel支持SMP模式時,那么CONFIG_SMP選項是一定會打開的,因此第一部分是必須實現的內容。而第二部分是否需要實現取決于熱插拔宏定義CONFIG_HOTPLUG_CPU是否打開。
CONFIG_SMP宏定義:
CONFIG_HOTPLUG_CPU宏定義:
02
—
SMP初始化
- 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決定。
其實例化如下:
- smp_secondary_init 
這個函數是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的完整初始化流程。
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關注我的公眾號
總結
以上是生活随笔為你收集整理的Linux kernel之SMP初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何在没有RTDS硬件下使用RSCAD进
- 下一篇: 给不起钱的大公司,算不上大公司
