= RT_SVC_DESCS_START) (RT_SVC_DECS_NUM < MAX_RT_SVCS)); if (RT_SVC_DECS_NUM == 0) retur" />

一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

ATF中bl31函數(shù)介紹與使用

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:TrustZone ? 2023-11-07 16:23 ? 次閱讀

runtime_svc_init函數(shù)

該函數(shù)主要用來(lái)建立安全監(jiān)控模式調(diào)用處理函數(shù)的索引表,并執(zhí)行EL3中提供的服務(wù)項(xiàng)的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動(dòng)TEE OS。

而這些處理函數(shù)是通過(guò)DECLARE_RT_SVC宏定義被編譯到鏡像文件的rt_svc_descs段中的。

void runtime_svc_init(void)

        {

            int rc = 0, index, start_idx, end_idx;

            /*判定rt_svc_descs段中service條數(shù)的是否超出MAX_RT_SVCS條*/

            assert((RT_SVC_DESCS_END >= RT_SVC_DESCS_START) &&

                    (RT_SVC_DECS_NUM < MAX_RT_SVCS));

            if (RT_SVC_DECS_NUM == 0)

                return;

            /* 初始化t_svc_descs_indices數(shù)組中的數(shù)據(jù)成-1,表示當(dāng)前所有的service無(wú)效*/

            memset(rt_svc_descs_indices, -1, sizeof(rt_svc_descs_indices));

            /*  獲取第一條EL3  service在RAM中的起始地址,通過(guò)獲取RT_SVC_DESCS_START的值來(lái)確定,

            該值在鏈接文件中有定義 */

            rt_svc_descs = (rt_svc_desc_t *) RT_SVC_DESCS_START;

            /*  遍歷整個(gè)rt_svc_des段,將其call  type與rt_svc_descs_indices中的index建立對(duì)應(yīng)

            關(guān)系 */

            for (index = 0; index < RT_SVC_DECS_NUM; index++) {

            rt_svc_desc_t *service = &rt_svc_descs[index];

                /* 判定在編譯時(shí)注冊(cè)的service是否有效 */

                rc = validate_rt_svc_desc(service);

                if (rc) {

                    ERROR("Invalid runtime service descriptor %pn",

                        (void *) service);

                    panic();

                }

                /* 執(zhí)行當(dāng)前service的init的操作 */

                if (service- >init) {

                    rc = service- >init();

                    if (rc) {

                    ERROR("Error initializing runtime service %sn",

                                  service- >name);

                        continue;

                    }

                }

                /*  根據(jù)該service的call  type以及start  oen來(lái)確定唯一的index,并且將該service

                中支持的所有call type生成唯一的標(biāo)識(shí)映射到同一個(gè)index中 */

                start_idx = get_unique_oen(rt_svc_descs[index].start_oen,

                        service- >call_type);

                assert(start_idx < MAX_RT_SVCS);

                  end_idx = get_unique_oen(rt_svc_descs[index].end_oen,

                          service- >call_type);

                  assert(end_idx < MAX_RT_SVCS);

                  for (; start_idx <= end_idx; start_idx++)

                      rt_svc_descs_indices[start_idx] = index;

              }

          }

DECLARE_RT_SVC

該宏用來(lái)在編譯時(shí)將EL3中的service編譯進(jìn)rt_svc_descs段中。該宏定義如下:

#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) 

            static const rt_svc_desc_t __svc_desc_ ## _name 

                __section("rt_svc_descs") __used = { 

                    .start_oen = _start, 

                    .end_oen = _end, 

                    .call_type = _type, 

                    .name = #_name, 

                    .init = _setup, 

                    .handle = _smch }

該宏中的各種參數(shù)說(shuō)明如下:

  • ? □ start_oen:該service的起始內(nèi)部編號(hào);
  • ? □ end.oen:該service的末尾編號(hào);
  • ? □ call_type:調(diào)用的smc的類型;
  • ? □ name:該service的名字;
  • ? □ init:該service在執(zhí)行之前需要被執(zhí)行的初始化操作;
  • ? □ handle:當(dāng)觸發(fā)了call type的調(diào)用時(shí)調(diào)用的處理該請(qǐng)求的函數(shù)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 監(jiān)控
    +關(guān)注

    關(guān)注

    6

    文章

    2285

    瀏覽量

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

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63906
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    9154
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)于TF-A(ATF)固件的基本知識(shí)詳解

    。ATF定義的啟動(dòng)模型ATF將鏡像進(jìn)行了劃分,BL1 BL2屬于啟動(dòng)引導(dǎo)鏡像,BL3屬于runtime鏡像。
    發(fā)表于 06-15 16:57

    S32g如何在ATF啟用安全啟動(dòng)?

    /cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函數(shù)
    發(fā)表于 04-03 07:12

    如何讓BL31的調(diào)試信息輸出到S32R45的uart?

    我用“DEBUG=1”構(gòu)建 ATF 映像,uart 可以顯示 BL2 的調(diào)試信息,但沒(méi)有顯示 BL31 的調(diào)試信息。 為什么?BL2到BL31
    發(fā)表于 04-11 08:20

    BL31未在Kirkstone上加載的原因?

    imx8mm_evk.h 和 imx8mm_evk.c 的設(shè)置時(shí),SPL 打印 do uart3,但它應(yīng)該顯示:注意:BL31:v2.6(發(fā)布
    發(fā)表于 04-19 11:00

    ATF啟動(dòng)流程介紹

    Boot Firmware,一般為Trusted Bootloader。 ? BL31 - EL3 Runtime Firmware,一般為SML,管理SMC執(zhí)行處理和中斷,運(yùn)行在secure
    的頭像 發(fā)表于 11-02 17:51 ?1537次閱讀
    <b class='flag-5'>ATF</b>啟動(dòng)流程<b class='flag-5'>介紹</b>

    ATF的啟動(dòng)過(guò)程介紹

    ATF的啟動(dòng)過(guò)程根據(jù)ARMv8的運(yùn)行模式(AArch32/AArch64)會(huì)有所不同,但基本一致。 在AArch32是不會(huì)去加載bl31而是將EL3或者M(jìn)onitor模式的運(yùn)行代碼保存在bl
    的頭像 發(fā)表于 11-07 15:48 ?1619次閱讀
    <b class='flag-5'>ATF</b>的啟動(dòng)過(guò)程<b class='flag-5'>介紹</b>

    code層面 ATFbl1的啟動(dòng)

    系統(tǒng)上電之后首先會(huì)運(yùn)行ChipRom,之后會(huì)跳轉(zhuǎn)到ATFbl1繼續(xù)執(zhí)行。bl1主要初始化CPU、設(shè)定異常向量、將bl2的鏡像加載到安全R
    的頭像 發(fā)表于 11-07 15:53 ?1518次閱讀
    code層面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的啟動(dòng)

    ATFbl2的啟動(dòng)

    bl2_entrypoint函數(shù)最終會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc) ,通知bl1將CPU的控制權(quán)限轉(zhuǎn)交給bl31,然后執(zhí)行bl31。 該
    的頭像 發(fā)表于 11-07 15:59 ?1086次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>2的啟動(dòng)

    ATF如何用函數(shù)完成bl2的啟動(dòng)

    bl31加載到內(nèi)存后會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc)將CPU權(quán)限轉(zhuǎn)交給bl31。 該函數(shù)的主要內(nèi)容和相關(guān)注釋如下: ** void bl2
    的頭像 發(fā)表于 11-07 16:04 ?957次閱讀

    ATFbl2到bl31的跳轉(zhuǎn)介紹

    bl2到bl31的跳轉(zhuǎn) 在bl2_main函數(shù)中最終會(huì)調(diào)用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next
    的頭像 發(fā)表于 11-07 16:09 ?1251次閱讀

    ATFbl31的啟動(dòng)

    如下: func bl31 _entrypoint /* el3初始化操作,該el3_ entrypoint _common函數(shù)在上面已經(jīng)介紹過(guò),其中runtime_ exceptions為 el3 runtime softwa
    的頭像 發(fā)表于 11-07 16:13 ?1650次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl31</b>的啟動(dòng)

    ATFbl32的啟動(dòng)方法

    ATFbl32的啟動(dòng) bl31的runtime_svc_init函數(shù)會(huì)初始化OP-TEE對(duì)應(yīng)
    的頭像 發(fā)表于 11-07 16:32 ?890次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的啟動(dòng)方法

    Bl31斷處理流程概述

    aarch64架構(gòu),在每個(gè)異常等級(jí)下都包含了四張異常等級(jí)表。 bl31的異常向量表定義在runtime_exceptions.S,其與下圖的定義一致
    的頭像 發(fā)表于 11-07 17:43 ?855次閱讀
    <b class='flag-5'>Bl31</b><b class='flag-5'>中</b>斷處理流程概述

    psci接口規(guī)范介紹

    由于psci是由linux內(nèi)核調(diào)用bl31的安全服務(wù),實(shí)現(xiàn)cpu電源管理功能的。因此其軟件架構(gòu)包含三個(gè)部分: (1)內(nèi)核與bl31之間的調(diào)用接口規(guī)范 (2)內(nèi)核的架構(gòu) (3)
    的頭像 發(fā)表于 12-05 16:53 ?1229次閱讀

    bl31的psci架構(gòu)介紹

    bl31的psci架構(gòu) bl31為內(nèi)核提供了一系列運(yùn)行時(shí)服務(wù),psci作為其標(biāo)準(zhǔn)運(yùn)行時(shí)服務(wù)的一部分,通過(guò)宏DECLARE_RT_SVC注冊(cè)到系統(tǒng)。其相應(yīng)的定義如下: DECLARE
    的頭像 發(fā)表于 12-05 17:33 ?1338次閱讀
    <b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架構(gòu)<b class='flag-5'>介紹</b>