補充一下一個使用自旋表作為啟動方式的平臺設備樹cpu節點:
arch/arm64/boot/dts/xxx.dtsi:
cpu@0 {
device_type = "cpu";
compatible = "arm,armv8";
reg = < 0x0 0x000 >;
enable-method = "spin-table";
cpu-release-addr = < 0x1 0x0000fff8 >;
};
spin-table方式的多核啟動方式,顧名思義在于自旋,主處理器和從處理器上電都會啟動,主處理器執行uboot暢通無阻,從處理器在spin_table_secondary_jump處wfe睡眠,主處理器通過修改設備樹的cpu節點的cpu-release-addr屬性為spin_table_cpu_release_addr,這是從處理器的釋放地址所在的地方。
主處理器進入內核后,會通過smp_prepare_cpus函數調用spin-table 對應的cpu操作集的cpu_prepare方法從而在smp_spin_table_cpu_prepare函數中設置從處理器的釋放地址為secondary_holding_pen這個內核函數,然后通過sev指令喚醒從處理器,從處理器繼續從secondary_holding_pen開始執行(從處理器來到了內核的世界),發現secondary_holding_pen_release不是自己的處理編號,然后通過wfe繼續睡眠。
當主處理器完成了大多數的內核組件的初始化之后,調用smp_init來來開始真正的啟動從處理器,最終調用spin-table 對應的cpu操作集的cpu_boot方法從而在smp_spin_table_cpu_boot將需要啟動的處理器的編號寫入secondary_holding_pen_release中,然后再次sev指令喚醒從處理器,從處理器得以繼續執行(設置自己異常向量表,初始化mmu等)。
最終在idle線程中執行wfi睡眠。其他從處理器也是同樣的方式啟動起來,同樣最后進入各種idle進程執行wfi睡眠,主處理器繼續往下進行內核初始化,直到啟動init進程,后面多個處理器都被啟動起來,都可以調度進程,多進程還會被均衡到多核。
問題
- 1、 而啟動流程中哪個cpu作為primary cpu可以任意指定?primary cpu如何任意指定的?
啟動的匯編代碼中會通過cpu的affinity值獲取當前cpu的id,然后將自身cpu id與指定cpu id進行比較,以確定當前cpu是否是primary cpu
- 2、cpu hotplug對于spintable是必須的嗎?
spintable啟動方式不支持cpu hotplug,只是在secondary 啟動時復用了hotplug相同的流程,這部分代碼默認是會被編譯到內核中的
但是spin-table方式非常簡單,但其只能被用于secondary cpu啟動,功能比較單一。
隨著aarch64架構電源管理需求的增加(如cpu熱插拔、cpu idle等),arm設計了一套標準的電源管理接口協議psci。
該協議可以支持所有cpu相關的電源管理接口,而且由于電源相關操作是系統的關鍵功能,為了防止其被攻擊,該協議將底層相關的實現都放到了secure空間,從而可提高系統的安全性。
-
處理器
+關注
關注
68文章
19286瀏覽量
229841 -
cpu
+關注
關注
68文章
10863瀏覽量
211763 -
SMP
+關注
關注
0文章
74瀏覽量
19665 -
設備樹
+關注
關注
0文章
38瀏覽量
3125
發布評論請先 登錄
相關推薦
評論