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

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

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

OP-TEE的內(nèi)核初始化函數(shù)調(diào)用

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

generic_boot_init_primary函數(shù)內(nèi)容

generic_boot_init_primary函數(shù)是OP-TEE建立系統(tǒng)運(yùn)行環(huán)境的入口函數(shù),該函數(shù)會(huì)進(jìn)行建立線程運(yùn)行空間、初始化OP-TEE內(nèi)核組件等操作。該函數(shù)的執(zhí)行流程如圖所示。

圖片
generic_boot_init_primary函數(shù)執(zhí)行流程

generic_boot_init_primary函數(shù)會(huì)調(diào)用init_primary_helper函數(shù)來完成系統(tǒng)運(yùn)行環(huán)境的建立 ,如果系統(tǒng)支持ATF,則該函數(shù)會(huì)返回OP-TEE的處理句柄,該處理句柄主要包含

  • ? 各種安全監(jiān)控模式調(diào)用的處理函數(shù)、
  • ? 安全世界狀態(tài)(SWS)的中斷
  • ? 以及其他事件的處理函數(shù),

ATF中的bl31解析完安全監(jiān)控模式調(diào)用或中斷請(qǐng)求后會(huì)在安全世界狀態(tài)調(diào)用該處理句柄來處理對(duì)應(yīng)的事件。

init_primary_helper函數(shù)的主要內(nèi)容如下:

static void init_primary_helper(unsigned long pageable_part,
                        unsigned long nsec_entry, unsigned long fdt)
        {
            thread_set_exceptions(THREAD_EXCP_ALL); //設(shè)置支持哪些異常處理
            init_vfp_sec();                             //初始化浮點(diǎn)運(yùn)算(根據(jù)實(shí)際需要考慮是否開啟)
            //初始化各種memory,清空BSS段,分配TA運(yùn)行時(shí)的memory
            init_runtime(pageable_part);
            /* 初始化TEE中支持的線程棧、異常處理、pagetable */
            thread_init_primary(generic_boot_get_handlers());
            //初始化每個(gè)CPU的monitor態(tài)的處理方式,如果支持ATF,則無需該操作
            thread_init_per_cpu();
            /* 如果系統(tǒng)不支持ATF,則需要配置在Linux內(nèi)核中monitor的處理方式 */
            init_sec_mon(nsec_entry);
            /* 初始化device tree */
            init_fdt(fdt);
            /* 初始化中斷控制器 */
            main_init_gic();
            /* 初始化非安全側(cè)的浮點(diǎn)運(yùn)算 */
            init_vfp_nsec();
            /* 初始化共享內(nèi)存并執(zhí)行存放在__initcall_start段的其他初始化函數(shù) */
            if (init_teecore() ! = TEE_SUCCESS)
                panic();
            DMSG("Primary CPU switching to normal world bootn");
        }

init_primary_helper函數(shù)最后會(huì)調(diào)用init_teecore來完成OP-TEE內(nèi)核的初始化 ,在init_teecore函數(shù)中會(huì)設(shè)定共享內(nèi)存、系統(tǒng)時(shí)間,然后再返回去執(zhí)行OP-TEE鏡像文件中的_initcall段中的內(nèi)容來啟動(dòng)系統(tǒng)的服務(wù)以及安全驅(qū)動(dòng)的掛載。

call_initcalls函數(shù)

init_teecore函數(shù)通過調(diào)用call_initcalls來 啟動(dòng)系統(tǒng)的服務(wù)以及安全驅(qū)動(dòng)的掛載 ,該函數(shù)的內(nèi)容如下:

static void call_initcalls(void)
        {
            initcall_t *call;
            /* 遍歷并執(zhí)行_initcallx段中所有函數(shù) */
            for (call = &__initcall_start; call < &__initcall_end; call++) {
                TEE_Result ret;
                  ret = (*call)();
                  if (ret ! = TEE_SUCCESS) {
                      EMSG("Initial call 0x%08" PRIxVA " failed",
                          (vaddr_t)call);
                  }
              }
          }

在執(zhí)行call_initcalls函數(shù)之前,系統(tǒng)已完成了 memory、CPU相關(guān)設(shè)置、中斷控制器、共享內(nèi)存、線程堆棧設(shè)置、TA運(yùn)行內(nèi)存的分配等操作 。

call_initcalls是通過遍歷OP-TEE鏡像文件的_initcall段中從_initcall_start到_initcall_end之間的所有函數(shù)來完成啟動(dòng)服務(wù)和驅(qū)動(dòng)的掛載操作。

OP-TEE鏡像文件中** _initcalls段的內(nèi)容是通過使用__define_initcall宏來告知編譯器的**,在編譯時(shí)會(huì)將使用該宏定義的函數(shù)保存到OP-TEE鏡像文件的_initcall段中。該宏定義如下:

#define __define_initcall(level, fn) 
            static initcall_t __initcall_##fn __attribute__((used)) 
            __attribute__((__section__(".initcall" level))) = fn
  • ? initcall_t:是一個(gè)函數(shù)指針類型(typedef int(*initcall_t)(void))。
  • ? attribute (( section ()):將fn對(duì)象放在一個(gè)由括號(hào)中的名稱指定的section中。
  • ? ##:連接作用。

例如,如果使用該宏如下:

__define_initcall("1", init_operation)

則該宏的作用是聲明一個(gè)名稱為__initcall_init_operation的函數(shù)指針,將該函數(shù)指針初始化為init_operation,并在編譯時(shí)將該函數(shù)的內(nèi)容存放在名稱為“.initcall1”的段中。

core/arch/arm/kernel/kern.ld.S文件中存在如下內(nèi)容:

__initcall_start = .;
        KEEP(*(.initcall1))
        KEEP(*(.initcall2))
        KEEP(*(.initcall3))
        KEEP(*(.initcall4))
        __initcall_end = .;

即在__initcall_start到__initcall_end之間保存的是initcall1到initcall4之間的內(nèi)容,而在整個(gè)OP-TEE源代碼的core/include/initcall.h文件中,__define_initcall宏被使用的情況如下:

#define __define_initcall(level, fn) 
        #define service_init(fn)            __define_initcall("1", fn)
        #define service_init_late(fn)      __define_initcall("2", fn)
        #define driver_init(fn)             __define_initcall("3", fn)
        #define driver_init_late(fn)       __define_initcall("4", fn)

所以遍歷執(zhí)行從__initcall_start到__initcall_end之間的內(nèi)容就是啟動(dòng)OP-TEE的服務(wù)以及完成安全驅(qū)動(dòng)的掛載。

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

    關(guān)注

    3

    文章

    1360

    瀏覽量

    40185
  • TEE
    TEE
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    10235
  • 函數(shù)調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    2578
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何初始化函數(shù)? 如何從代碼配置器調(diào)用函數(shù)?

    我有一個(gè)關(guān)于如何從代碼配置器初始化函數(shù)的問題,我如何從代碼配置器調(diào)用函數(shù)?我相信我有正確的代碼配置選項(xiàng)。只需要幫助初始化
    發(fā)表于 10-15 09:38

    請(qǐng)問Beal環(huán)境下編譯OP-TEE后生成FIP需要哪些文件?

    stm32mp157d-***-bl32.dtb fip.bin但是當(dāng)我使用 OP-TEE 時(shí),我使用以下命令:fiptool 創(chuàng)建 --tos-fw tee
    發(fā)表于 12-05 07:06

    請(qǐng)問HSE op-tee是什么關(guān)系?

    我有個(gè)問題。S32G同時(shí)支持HSE和op-tee。S32G的安全加解密和證書管理是通過HSE完成的嗎?op-tee 和 HSE 只是其中之一嗎?有沒有相關(guān)的設(shè)計(jì)文檔?謝謝
    發(fā)表于 04-06 06:26

    OP-TEE無法在鎖定的i.MX6UL上初始化JR怎么解決?

    imx 存儲(chǔ)庫(kù),而 U-boot 來自主線存儲(chǔ)庫(kù) (2023.1)在我們鎖定設(shè)備之前,這似乎工作正常。鎖定設(shè)備后,我們?cè)?OP-TEE 初始化時(shí)得到以下輸出(啟用了一些額外的跟蹤消息):E/TC:0 0
    發(fā)表于 04-17 07:31

    uboot和內(nèi)核里phy的初始化_內(nèi)核里的雙網(wǎng)絡(luò)配置及phy的初始化

    uboot 和內(nèi)核里 phy 的初始化,以及內(nèi)核里的雙網(wǎng)絡(luò)配置及 phy 的初始化。 本文以盈鵬飛嵌入式的CoM-335x(基于AM335x)核心板及網(wǎng)絡(luò)芯片LAN8720 為例,說明
    的頭像 發(fā)表于 05-17 08:19 ?1.2w次閱讀

    Linux內(nèi)核初始化過程中的調(diào)用順序

    所有的__init函數(shù)在區(qū)段.initcall.init中還保存了一份函數(shù)指針,在初始化時(shí)內(nèi)核會(huì)通過這些函數(shù)指針
    發(fā)表于 05-12 08:40 ?1600次閱讀

    UCOS2系統(tǒng)內(nèi)核講述(二)_ 初始化調(diào)用函數(shù)

    UCOS2系統(tǒng)內(nèi)核講述(二)_初始化調(diào)用函數(shù)
    的頭像 發(fā)表于 03-25 09:57 ?1729次閱讀
    UCOS2系統(tǒng)<b class='flag-5'>內(nèi)核</b>講述(二)_ <b class='flag-5'>初始化</b><b class='flag-5'>調(diào)用</b><b class='flag-5'>函數(shù)</b>

    OP-TEE中安全驅(qū)動(dòng)的框架

    OP-TEE中的安全驅(qū)動(dòng)是OP-TEE操作安全設(shè)備的載體。 TA通過調(diào)用某個(gè)安全驅(qū)動(dòng)的接口就可實(shí)現(xiàn)對(duì)特定安全設(shè)備的操作。安全驅(qū)動(dòng)在OP-TEE中的軟件框架如圖22-2所示。 (其實(shí)這里
    的頭像 發(fā)表于 10-30 16:04 ?776次閱讀
    <b class='flag-5'>OP-TEE</b>中安全驅(qū)動(dòng)的框架

    OP-TEE內(nèi)核初始化過程

    /arch/arm generic_entry_a64.S文件中。 2 OP-TEE內(nèi)核初始化過程 ** _star
    的頭像 發(fā)表于 11-02 17:57 ?1279次閱讀
    <b class='flag-5'>OP-TEE</b>的<b class='flag-5'>內(nèi)核</b><b class='flag-5'>初始化</b>過程

    reset_primary函數(shù)的執(zhí)行流程

    reset_primary函數(shù)OP-TEE對(duì)CPU主核進(jìn)行初始化操作的函數(shù),該函數(shù)會(huì)初始化
    的頭像 發(fā)表于 11-02 18:06 ?500次閱讀
    reset_primary<b class='flag-5'>函數(shù)</b>的執(zhí)行流程

    OP-TEE服務(wù)項(xiàng)的啟動(dòng)

    OP-TEE服務(wù)項(xiàng)的啟動(dòng)分為: service_init以及service_init_late ,需要被啟動(dòng)的服務(wù)項(xiàng)通過使用這兩個(gè)宏,在編譯時(shí),相關(guān)服務(wù)的內(nèi)容將會(huì)被保存到initcall1
    的頭像 發(fā)表于 11-07 15:04 ?664次閱讀

    ARM64位與ARM32位OP-TEE啟動(dòng)過程的差異

    進(jìn)入reset中去執(zhí)行OP-TEE啟動(dòng),而是直接在_start函數(shù)中就完成整個(gè)啟動(dòng)過程, 在進(jìn)行初始化操作之前會(huì)注冊(cè)一個(gè)異常向量表,該異常向量表會(huì)在喚醒從核階段被使用,當(dāng)主核通知喚醒從核時(shí),從核會(huì)查找
    的頭像 發(fā)表于 11-07 15:12 ?700次閱讀

    ATF中bl32的啟動(dòng)方法

    ATF中bl32的啟動(dòng) bl31中的runtime_svc_init函數(shù)會(huì)初始化OP-TEE對(duì)應(yīng)的服務(wù),通過調(diào)用該服務(wù)項(xiàng)的初始化
    的頭像 發(fā)表于 11-07 16:32 ?581次閱讀
    ATF中bl32的啟動(dòng)方法

    OP-TEE的安全存儲(chǔ)的簡(jiǎn)介

    時(shí),OP-TEE會(huì)對(duì)需要被保存的數(shù)據(jù)進(jìn)行加密,且每次更新安全文件時(shí)所用的加密密鑰都會(huì)使用隨機(jī)數(shù)重新生成,用戶只要調(diào)用GP標(biāo)準(zhǔn)中定義的安全存儲(chǔ)相關(guān)接口就能使用OP-TEE的安全存儲(chǔ)功能對(duì)私有數(shù)據(jù)進(jìn)行保護(hù)。 需要被保護(hù)的數(shù)據(jù)被
    的頭像 發(fā)表于 11-21 11:33 ?957次閱讀
    <b class='flag-5'>OP-TEE</b>的安全存儲(chǔ)的簡(jiǎn)介

    OP-TEE安全存儲(chǔ)安全文件的格式

    安全文件、dirf.db文件的數(shù)據(jù)格式和操作過程 OP-TEE的安全存儲(chǔ)功能可滿足用戶保存敏感數(shù)據(jù)的需求,需要被保存的數(shù)據(jù)會(huì)被加 密保存到文件系統(tǒng)或RPMB分區(qū)中 。 當(dāng)選擇將數(shù)據(jù)保存到文件系統(tǒng)中
    的頭像 發(fā)表于 11-21 11:49 ?692次閱讀
    <b class='flag-5'>OP-TEE</b>安全存儲(chǔ)安全文件的格式