boot_cpu_init //引導(dǎo)cpu初始化 設(shè)置引導(dǎo)cpu的位掩碼 online active present possible都為true - > setup_arch // arch/arm64/kernel/setup.c - > if (acpi_disabled) //不支持acpi psci_dt_init (); //drivers/firmware/psci.c(psci主要文件) psci初始化 解析設(shè)備樹 尋找psci匹配的節(jié)點(diǎn) else psci_acpi_init (); //acpi中允許使用psci情況 - > rest_init - > kernel_init - > kernel_init_freeable - > smp_prepare_cpus //準(zhǔn)備cpu 對于每個(gè)可能的cpu 1. cpu_ops[cpu]- >cpu_prepare(cpu) 2.set_" />

欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開核返回:EL1啟動(dòng)從處理器

麥辣雞腿堡 ? 來源:TrustZone ? 作者:Hcoco ? 2023-12-05 18:11 ? 次閱讀

init/main.c
start_kernel
- >boot_cpu_init   //引導(dǎo)cpu初始化  設(shè)置引導(dǎo)cpu的位掩碼 online active present possible都為true
- >setup_arch   // arch/arm64/kernel/setup.c
- >  if (acpi_disabled)  //不支持acpi
                  psci_dt_init();     //drivers/firmware/psci.c(psci主要文件) psci初始化 解析設(shè)備樹 尋找psci匹配的節(jié)點(diǎn)
          else
                  psci_acpi_init();   //acpi中允許使用psci情況
- >rest_init
- >kernel_init
- >kernel_init_freeable
- >smp_prepare_cpus  //準(zhǔn)備cpu       對于每個(gè)可能的cpu 1. cpu_ops[cpu]- >cpu_prepare(cpu)    2.set_cpu_present(cpu, true) cpu處于present狀態(tài)
- >do_pre_smp_initcalls   //多核啟動(dòng)之前的調(diào)用initcall回調(diào)
- >smp_init  //smp初始化  kernel/smp.c   會(huì)啟動(dòng)其他從處理器

我們主要關(guān)注兩個(gè)函數(shù):psci_dt_init和smp_init psci_dt_init是解析設(shè)備樹,設(shè)置操作函數(shù),smp_init用于啟動(dòng)從處理器。

- >psci_dt_init() //drivers/firmware/psci.c:
 - >init_fn()
  - >psci_0_1_init() //設(shè)備樹中compatible = "arm,psci"為例
   - >get_set_conduit_method() //根據(jù)設(shè)備樹method屬性設(shè)置 invoke_psci_fn = __invoke_psci_fn_smc;  (method="smc")
       - > invoke_psci_fn = __invoke_psci_fn_smc
   - >   if (!of_property_read_u32(np, "cpu_on", &id)) {
       651                 psci_function_id[PSCI_FN_CPU_ON] = id;
       652                 psci_ops.cpu_on = psci_cpu_on;  //設(shè)置psci操作的開核接口
       653         }
    - >psci_cpu_on()
     - >invoke_psci_fn()
      - >__invoke_psci_fn_smc()
        - > arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res)  //這個(gè)時(shí)候x0=function_id  x1=arg0, x2=arg1, x3arg2,...
         - >__arm_smccc_smc()
          - >SMCCC   smc //arch/arm64/kernel/smccc-call.S
            - >    20         .macro SMCCC instr
                21         .cfi_startproc
                22         instr  #0   //即是smc #0  陷入到el3
                23         ldr     x4, [sp]
                24         stp     x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
                25         stp     x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
                26         ldr     x4, [sp, #8]
                27         cbz     x4, 1f /* no quirk structure */
                28         ldr     x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
                29         cmp     x9, #ARM_SMCCC_QUIRK_QCOM_A6
                30         b.ne    1f
                31         str     x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
                32 1:      ret
                33         .cfi_endproc
                34         .endm

最終通過22行 陷入了el3中。(這是因?yàn)榘踩赃€需要到ATF中啟動(dòng))smp_init函數(shù)做從處理器啟動(dòng):

start_kernel
- >arch_call_rest_init
 - >rest_init
  - >kernel_init,
   - >kernel_init_freeable
    - >smp_prepare_cpus  //arch/arm64/kernel/smp.c
     - >smp_init  //kernel/smp.c  (這是從處理器啟動(dòng)的函數(shù))
      - >cpu_up
       - >do_cpu_up
        - >_cpu_up
         - >cpuhp_up_callbacks
          - >cpuhp_invoke_callback
          - >cpuhp_hp_states[CPUHP_BRINGUP_CPU]
           - >bringup_cpu
            - >__cpu_up  //arch/arm64/kernel/smp.c
             - >boot_secondary
              - >cpu_ops[cpu]- >cpu_boot(cpu)
               - >cpu_psci_ops.cpu_boot
                - >cpu_psci_cpu_boot   //arch/arm64/kernel/psci.c
                 46 static int cpu_psci_cpu_boot(unsigned int cpu)
                   47 { 
                   48         int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa_symbol(secondary_entry));
                   49         if (err)
                   50                 pr_err("failed to boot CPU%d (%d)n", cpu, err);
                   51   
                   52         return err;
                   53 }

啟動(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)對應(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),很容易繞暈。

(其實(shí)為了安全,所以啟動(dòng)從核開核這個(gè)操作必須在EL3,開了以后,就可以會(huì)EL1,因?yàn)橐呀?jīng)在EL3給你了準(zhǔn)確安全的啟動(dòng)位置了。)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19432

    瀏覽量

    231284
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10908

    瀏覽量

    213111
  • SMP
    SMP
    +關(guān)注

    關(guān)注

    0

    文章

    76

    瀏覽量

    19758
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62999
收藏 人收藏

    評論

    相關(guān)推薦

    Vs八移動(dòng)處理器 性能差異并不大

     毫無疑問,中央處理器(CPU)是所有計(jì)算機(jī)設(shè)備的大腦,智能手機(jī)也是如此。而隨著技術(shù)的發(fā)展,以ARM核心為主的移動(dòng)處理器也獲得了極大提升,突破1GHz主頻、雙
    發(fā)表于 04-10 16:20 ?4961次閱讀

    處理器和八處理器的區(qū)別,這篇文章終于講明白了

    一、四處理器介紹 四處理器即是基于單個(gè)半導(dǎo)體的一個(gè)處理器上擁有四個(gè)一樣功能的處理器核心。換句
    的頭像 發(fā)表于 12-13 09:42 ?13.7w次閱讀

    求一種在多處理器系統(tǒng)中的Nios II軟處理器啟動(dòng)方案

    本文設(shè)計(jì)了一種在多處理器系統(tǒng)中的Nios II軟處理器啟動(dòng)方案,這個(gè)方案在外部處理器向Nios II的程序存儲(chǔ)
    發(fā)表于 04-27 06:52

    探討一下ARM處理器中的CPSR寄存

    ,不在使用單一的CPSR寄存,來保存當(dāng)前處理器狀態(tài),而是用PSTATE來保存處理器狀態(tài)。PSTATE,包括以下的一些系統(tǒng)寄存1. NZ
    發(fā)表于 04-01 15:17

    分析ARMv8處理器產(chǎn)生異常的原因以及異常返回時(shí)的動(dòng)作

    使用SVC調(diào)用內(nèi)核,并允許內(nèi)核代表它們調(diào)用更高的異常級別。操作系統(tǒng)內(nèi)核(EL1),軟件可以使用HVC指令調(diào)用虛擬機(jī)監(jiān)控程序(EL2),或者使用SMC指令調(diào)用安全監(jiān)視
    發(fā)表于 05-23 15:51

    多核處理器啟動(dòng)的基本原理是什么?如何實(shí)現(xiàn)呢

    了。單核處理器啟動(dòng)初始化過程也就結(jié)束了。對于多核處理器系統(tǒng),情況復(fù)雜一些。一般是有一個(gè)主(有時(shí)叫core 0)先去完成上述的操作。主
    發(fā)表于 06-07 16:41

    看看一個(gè)多核處理器系統(tǒng)是如何啟動(dòng)

    了。單核處理器啟動(dòng)初始化過程也就結(jié)束了。對于多核處理器系統(tǒng),情況復(fù)雜一些。一般是有一個(gè)主(有時(shí)叫core 0)先去完成上述的操作。主
    發(fā)表于 07-19 15:00

    EL1882/EL1882C pdf datasheet (

    EL1882/EL1
    發(fā)表于 01-17 21:29 ?17次下載

    什么是雙處理器

    什么是雙處理器 什么是雙處理器呢?雙處理器背后的概念蘊(yùn)涵著什么意義呢?簡而言之,雙
    發(fā)表于 10-12 09:47 ?1.7w次閱讀

    Banias處理器

    Banias處理器  2003年1月,Intel全新的移動(dòng)處理器迅馳(Banias)問世,,與以往處理器不同,Banias開始Intel
    發(fā)表于 01-22 10:26 ?485次閱讀

    Intel雙處理器,Intel雙處理器是什么意思

    Intel雙處理器,Intel雙處理器是什么意思 Intel Pentium D技術(shù)架構(gòu)及產(chǎn)品 基于Smithfield內(nèi)核的Pentium D 800系列 Smithf
    發(fā)表于 03-26 15:10 ?2724次閱讀

    什么是雙處理器?

      簡單來說,雙處理器就是在一個(gè)硅片上集成兩個(gè)CPU。那么什么是雙處理器呢?雙處理器背后的
    發(fā)表于 10-08 18:21 ?993次閱讀

    處理器簡介

    處理器即是基于單個(gè)半導(dǎo)體的一個(gè)處理器上擁有四個(gè)一樣功能的處理器核心。換句話說,將四個(gè)物理處理器核心整合入一個(gè)
    發(fā)表于 03-02 15:11 ?3335次閱讀
    四<b class='flag-5'>核</b><b class='flag-5'>處理器</b>簡介

    處理器還是四好?四處理器和八處理器的區(qū)別介紹

    摘要:目前出現(xiàn)在的市面上的手機(jī)有四的也有八的,那么它們兩者之間有什么區(qū)別?是八處理器好還是四
    發(fā)表于 12-08 17:54 ?10.2w次閱讀

    處理器是什么意思

    處理器是什么意思?處理器是一臺(tái)電腦的大腦,它的性能直接影響著整體電腦的性能。大家對處理器了解多少,知道八
    發(fā)表于 05-23 09:38 ?2w次閱讀