最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一文玩轉(zhuǎn)ARM64 SMP多核啟動(dòng)(二)- PSCI(超級(jí)詳細(xì)~)

2022-05-30 19:56 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

4.支持psci情況

  • 上面說(shuō)了pin-table的多核啟動(dòng)方式,看似很繁瑣,實(shí)際上并不復(fù)雜,無(wú)外乎主處理器喚醒從處理器到指定地址上去執(zhí)行指令,說(shuō)他簡(jiǎn)單是相對(duì)于功能來(lái)說(shuō)的,因?yàn)樗皇菍?shí)現(xiàn)了從處理器的啟動(dòng),僅此而已,所以,現(xiàn)在社區(qū)幾乎很少使用spin-table這種方式,取而代之的是psci,他不僅可以啟動(dòng)從處理器,還可以關(guān)閉,掛起等其他核操作,現(xiàn)在基本上arm64平臺(tái)上使用多核啟動(dòng)方式都是psci。下面我們來(lái)揭開(kāi)他神秘的面紗,其實(shí)理解了spin-table的啟動(dòng)方式,psci并不難(說(shuō)白了也是需要主處理器給從處理器一個(gè)啟動(dòng)地址,然后從處理器從這個(gè)地址執(zhí)行指令,實(shí)際上比這要復(fù)雜的多)。

  • 首先,我們先來(lái)看下設(shè)備樹(shù)cpu節(jié)點(diǎn)對(duì)psci的支持:

  • psci節(jié)點(diǎn)的詳細(xì)說(shuō)明可以參考內(nèi)核文檔:Documentation/devicetree/bindings/arm/psci.txt

  • 可以看到現(xiàn)在enable-method 屬性已經(jīng)是psci,說(shuō)明使用的多核啟動(dòng)方式是psci, 下面還有psci節(jié)點(diǎn),用于psci驅(qū)動(dòng)使用,method用于說(shuō)明調(diào)用psci功能使用什么指令,可選有兩個(gè)smc和hvc。其實(shí)smc, hvc和svc都是從低運(yùn)行級(jí)別向高運(yùn)行級(jí)別請(qǐng)求服務(wù)的指令,我們最常用的就是svc指令了,這是實(shí)現(xiàn)系統(tǒng)調(diào)用的指令。高級(jí)別的運(yùn)行級(jí)別會(huì)根據(jù)傳遞過(guò)來(lái)的參數(shù)來(lái)決定提供什么樣的服務(wù)。smc是用于陷入el3(安全), hvc用于陷入el2(虛擬化, 虛擬化場(chǎng)景中一般通過(guò)hvc指令陷入el2來(lái)請(qǐng)求喚醒vcpu), svc用于陷入el1(系統(tǒng))。

  • 注:本文只講解smc陷入el3啟動(dòng)多核的情況。

  • 下面開(kāi)始分析源代碼:

  • 我們都知道armv8將異常等級(jí)分為el0 - el3,其中,el3為安全監(jiān)控器,為了實(shí)現(xiàn)對(duì)它的支持,arm公司設(shè)計(jì)了一種firmware叫做ATF(ARM Trusted firmware),下面是atf源碼readme.rst文件的一段介紹:

  • ATF代碼運(yùn)行在EL3, 是實(shí)現(xiàn)安全相關(guān)的軟件部分固件,其中會(huì)為其他特權(quán)級(jí)別提供服務(wù),也就是說(shuō)提供了在EL3中服務(wù)的手段,我們本文介紹的PSCI的實(shí)現(xiàn)就是在這里面,本文不會(huì)過(guò)多的講解(注:其實(shí)本文只會(huì)涉及到atf如何響應(yīng)服務(wù)el1的smc發(fā)過(guò)來(lái)的psci的服務(wù)請(qǐng)求,僅此而已,有關(guān)ATF(Trustzone)請(qǐng)參考其他資料)。

  • 那么就開(kāi)始我們的正題:

  • 下面從源代碼角度分析服務(wù)的注冊(cè)處理流程:

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)??


4.2 服務(wù)注冊(cè)

  • 下面的宏是用于注冊(cè)運(yùn)行時(shí)服務(wù)的接口,每種服務(wù)通過(guò)它來(lái)注冊(cè):

在標(biāo)準(zhǔn)的運(yùn)行時(shí)服務(wù)中將服務(wù)初始化和處理函數(shù)放到rt_svc_descs段中,供調(diào)用。

在runtime_svc_init函數(shù)中,調(diào)用每一個(gè)通過(guò)DECLARE_RT_SVC注冊(cè)的服務(wù),其中包括std_svc服務(wù):

4.3 運(yùn)行時(shí)服務(wù)初始化處理

  • std_svc_setup?。ㄖ饕P(guān)注設(shè)置psci操作集)

  • 可以看到,在遍歷每一個(gè)注冊(cè)的運(yùn)行時(shí)服務(wù)的時(shí)候,會(huì)導(dǎo)致std_svc_setup調(diào)用,其中會(huì)做psci操作集的設(shè)置,操作集中我們可以看到對(duì)核電源的管理的接口如:核上電,下電,掛起等,我們主要關(guān)注上電 .pwr_domain_on = qemu_pwr_domain_on,這個(gè)接口當(dāng)我們主處理器boot從處理器的時(shí)候會(huì)用到。

4.4 運(yùn)行時(shí)服務(wù)觸發(fā)和處理

  • smc指令觸發(fā)進(jìn)入el3異常向量表:

  • 上面其實(shí)主要的是找到服務(wù)例程,然后跳轉(zhuǎn)執(zhí)行

  • 下面是跳轉(zhuǎn)的處理函數(shù):

  • 處理函數(shù)根據(jù)funid來(lái)決定服務(wù),可以看到PSCI_CPU_ON_AARCH64為0xc4000003,這正是設(shè)備樹(shù)中填寫(xiě)的cpu_on屬性的id,會(huì)委托psci_cpu_on來(lái)執(zhí)行核上電任務(wù)。

  • 下面分析是重點(diǎn):?。?!

  • psci_cpu_on主要完成開(kāi)核的工作,然后會(huì)設(shè)置一些異常返回后寄存器的值(eg:從el1 -> el3 -> el1),重點(diǎn)關(guān)注 ep->pc寫(xiě)到cpu_context結(jié)構(gòu)的CTX_ELR_EL3偏移處(從處理器啟動(dòng)后會(huì)從這個(gè)地址取指執(zhí)行)。

  • 實(shí)際上,所有的從處理器啟動(dòng)后都會(huì)從bl31_warm_entrypoint開(kāi)始執(zhí)行,在plat_setup_psci_ops中會(huì)設(shè)置(每個(gè)平臺(tái)都有自己的啟動(dòng)地址寄存器,通過(guò)寫(xiě)這個(gè)寄存器來(lái)獲得上電后執(zhí)行的指令地址)。

  • 大致說(shuō)一下:主處理器通過(guò)smc進(jìn)入el3請(qǐng)求開(kāi)核服務(wù),atf中會(huì)響應(yīng)這種請(qǐng)求,通過(guò)平臺(tái)的開(kāi)核操作來(lái)啟動(dòng)從處理器并且設(shè)置從處理的一些寄存器eg:scr_el3、spsr_el3、elr_el3,然后主處理器,恢復(fù)現(xiàn)場(chǎng),eret再次回到el1,而處理器開(kāi)核之后會(huì)從bl31_warm_entrypoint開(kāi)始執(zhí)行,最后通過(guò)el3_exit返回到el1的elr_el3設(shè)置的地址。

  • 分析到這atf的分析到此為止,atf中主要是響應(yīng)內(nèi)核的snc的請(qǐng)求,然后做開(kāi)核處理,也就是實(shí)際的開(kāi)核動(dòng)作,但是從處理器最后還是要回到內(nèi)核中執(zhí)行,下面分析內(nèi)核的處理:注意流程如下:

  • 我們主要關(guān)注兩個(gè)函數(shù):psci_dt_init和smp_init

  • psci_dt_init是解析設(shè)備樹(shù),設(shè)置操作函數(shù),smp_init用于啟動(dòng)從處理器。

  • 最終通過(guò)22行 陷入了el3中。

  • smp_init函數(shù)做從處理器啟動(dòng):

  • 啟動(dòng)從處理的時(shí)候最終調(diào)用到psci的cpu操作集的cpu_psci_cpu_boot函數(shù),會(huì)調(diào)用上面的psci_cpu_on,最終調(diào)用smc,傳遞第一個(gè)參數(shù)為cpu的id標(biāo)識(shí)啟動(dòng)哪個(gè)cpu,第二個(gè)參數(shù)為從處理器啟動(dòng)后進(jìn)入內(nèi)核執(zhí)行的地址secondary_entry(這是個(gè)物理地址)。

  • 所以綜上,最后smc調(diào)用時(shí)傳遞的參數(shù)為arm_smccc_smc(0xC4000003, cpuid, secondary_entry, arg2, 0, 0, 0, 0, &res)。

  • 這樣陷入el3之后,就可以啟動(dòng)對(duì)應(yīng)的從處理器,最終從處理器回到內(nèi)核(el3->el1),執(zhí)行secondary_entry處指令,從處理器啟動(dòng)完成。

  • 可以發(fā)現(xiàn)psci的方式啟動(dòng)從處理器的方式相當(dāng)復(fù)雜,這里面涉及到了el1到安全的el3的跳轉(zhuǎn),而且涉及到大量的函數(shù)回調(diào),很容易繞暈。

  • 下面給出psci方式多核啟動(dòng)圖示:

5.從處理器啟動(dòng)進(jìn)入內(nèi)核世界之后做了些什么

  • 無(wú)論是spin-table還是psci,從處理器啟動(dòng)進(jìn)入內(nèi)核之后都會(huì)執(zhí)行secondary_startup:

__cpu_up中設(shè)置了secondary_data結(jié)構(gòu)中的一些成員:

跳轉(zhuǎn)到secondary_start_kernel這個(gè)C函數(shù)繼續(xù)執(zhí)行初始化:

  • 實(shí)際上,可以看的當(dāng)從處理器啟動(dòng)到內(nèi)核的時(shí)候,他們也需要設(shè)置異常向量表,設(shè)置mmu等,然后執(zhí)行各自的idle進(jìn)程(這些都是一些處理器強(qiáng)相關(guān)的初始化代碼,一些通用的初始化都已經(jīng)被主處理器初始化完),當(dāng)cpu負(fù)載均衡 的時(shí)候會(huì)放置一些進(jìn)程到這些從處理器,然后進(jìn)程就可以再這些從處理器上歡快的運(yùn)行。


6.最后說(shuō)兩句

  • 寫(xiě)到這里,關(guān)于arm64平臺(tái)的多核啟動(dòng)已經(jīng)介紹完成,可以發(fā)現(xiàn)里面還是會(huì)涉及到很多細(xì)節(jié),源碼散落在uboot,atf,kernel等源碼目錄中,多核啟動(dòng)并不是很神秘,都是需要告訴從處理器從那個(gè)地方開(kāi)始取值執(zhí)行,然后從處理器進(jìn)入內(nèi)核后需要自身做一些必要的初始化,就進(jìn)入idle狀態(tài)等待有任務(wù)來(lái) 調(diào)度,我們主要以分析源代碼的方式講解了spin-table和psci兩種方式來(lái)啟動(dòng)多核,而arm64平臺(tái)使用psci更為廣泛。


一文玩轉(zhuǎn)ARM64 SMP多核啟動(dòng)(二)- PSCI(超級(jí)詳細(xì)~)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
文昌市| 英吉沙县| 宿州市| 门源| 鹿泉市| 舟山市| 瓦房店市| 澎湖县| 平顶山市| 龙南县| 安平县| 藁城市| 宣恩县| 永春县| 临漳县| 康定县| 安阳县| 宁城县| 呼图壁县| 南安市| 双牌县| 肇州县| 皮山县| 广元市| 凌海市| 嘉善县| 宁乡县| 万州区| 兰州市| 扶余县| 海南省| 鸡泽县| 峨边| 乌什县| 志丹县| 金山区| 洮南市| 陵川县| 广丰县| 渝中区| 保靖县|