历经一年多时间的系统整理合补充,《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件,从用户空间到内核空间的顺序对TEE技术详细阐述,读者可从用户空间到TEE内核一步一步了解系统安全的所有内容,同时书中也提供了相关的示例代码,读者可根据自身实际需求开发TA。目前该书已在天猫、京东、当当同步上线,链接如下(麻烦书友购书时能给予评论,多谢多谢)

京东购买地址

当当购买地址

天猫购买地址

非常感谢在此期间大家的支持以及各位友人的支持和帮助!!!。

为方便和及时的回复读者对书中或者TEE相关的问题的疑惑,也为了大家能有一个统一的交流平台。我搭建了一个简单的论坛,网址如下:

https://www.huangtengxq.com/discuz/forum.php

关于您的疑问可在“相关技术讨论“”中发帖,我会逐一回复。也欢迎大家发帖,一起讨论TEE相关的一些有意思的feature。共同交流。同时该论坛中也会添加关于移动端虚拟化的相关技术的板块,欢迎各位共同交流学习

  

当系统使用了ATF的时候,monitor态的中断向量表将会在bl31中被设置,本文将介绍不带ATF的情况下系统出现FIQ的时候,整个系统时如何处理的。从《15. OP-TEE中的中断处理(一)------中断配置和向量表的配置》文中的图上可以看出,FIQ只会在当系统处于secure world和monitor态的时候才会生效。下面将分别介绍两种状态下对FIQ的处理流程。在OP-TEE的文档资料中给出了FIQ的整个处理流程如下,包括monitor态和secure world态的处理流程:

1.monitor态下FIQ事件的处理

  由于不带ATF,所以当CPU处于monitor态时产生FIQ,则必然进入的是monitor的中断向量中去寻找处理函数。而monitor的中断向量是怎么样的呢?在monitor态下FIQ又是被如何才处理的呢?

  下图为在monitore态下整个FIQ事件的初始化流程图:

1.1 monitor态的中断处理向量表的配置

  在OP-TEE的启动的过程中,将会调用init_sec_mon函数来完成monitor态的相关初始化,该函数被定义在optee_os/core/arch/arm/kernel/thread.c文件中,从初始化的时候调用的流程如下:

_start--> b reset-->b reset_primary-->bl generic_boot_init_primary-->init_primary_helper-->init_sec_mon

  init_sec_mon函数的内容如下:

static void init_sec_mon(size_t pos __maybe_unused)
{
#if !defined(CFG_WITH_ARM_TRUSTED_FW)/* Initialize secure monitor */
/* 调用sm_init函数完成Monitor态的相关初始化 */sm_init(GET_STACK(stack_tmp[pos]));
#endif
}

该函数会调用sm_init来进行monitor的相关初始化,sm_init函数定义在optee_os/core/arch/arm/sm/sm_a32.S文件中,内容如下:

/* void sm_init(vaddr_t stack_pointer); */
FUNC sm_init , :
UNWIND( .fnstart)/* Set monitor stack */mrs r1, cpsr    //设置monitor的栈cps    #CPSR_MODE_MON/* Point just beyond sm_ctx.sec */sub sp, r0, #(SM_CTX_SIZE - SM_CTX_NSEC)msr cpsr, r1/* Set monitor vector (MVBAR) */ldr r0, =sm_vect_table //获取monitor态的中断向量表变量write_mvbar r0      //将中断向量表的地址写入到MVBAR寄存器中bx   lr
END_FUNC sm_init

  该函数将会将monitor态下的中断向量事件的处理地址写入到MVBAR寄存器中,以便在monitor态下产生中断时能够找到中断处理函数。而monitore的中断向量表就是sm_vect_table。该变量内容如下:

LOCAL_FUNC sm_vect_table , :
UNWIND( .fnstart)
UNWIND( .cantunwind)b   .       /* Reset            */b .       /* Undefined instruction    */b sm_smc_entry    /* Secure monitor call */b  .       /* Prefetch abort       */b .       /* Data abort           */b .       /* Reserved         */b .       /* IRQ              */b sm_fiq_entry    /* FIQ              */
UNWIND( .fnend)
END_FUNC sm_vect_table

  从sm_vect_tabl函数可知,当在monitor态下才产生smc时,将会调用sm_smc_entry函数来进行处理,而当在monitor下出现FIQ时,将会调用sm_fiq_entry函数来进行才处理。

1.2 monitor态下FIQ事件的处理过程

  当在monitor态下产生FIQ时,CPU将会调用存放在MVBAR寄存器中的的sm_smc_entry函数来进行处理。由于是产生了FIQ事件,故最终会调用sm_fiq_entry函数来进行处理。该函数定义在optee_os/core/arch/arm/sm/sm_a32.S文件中,内容如下:

LOCAL_FUNC sm_fiq_entry , :
UNWIND( .fnstart)
UNWIND( .cantunwind)/* FIQ has a +4 offset for lr compared to preferred return address */sub   lr, lr, #4/* sp points just past struct sm_sec_ctx */srsdb  sp!, #CPSR_MODE_MONpush {r0-r7}clrex        /* Clear the exclusive monitor *//** As we're coming from non-secure world the stack pointer points* to sm_ctx.nsec.r0 at this stage. After the instruction below the* stack pointer points to sm_ctx.*/sub    sp, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R0)/* Update SCR */read_scr r1bic  r1, r1, #(SCR_NS | SCR_FIQ) /* Clear NS and FIQ bit in SCR */write_scr r1/* Save non-secure context */add   r0, sp, #SM_CTX_NSECbl  sm_save_modes_regsstm   r0!, {r8-r12}/* Set FIQ entry */ldr r0, =(thread_vector_table + THREAD_VECTOR_TABLE_FIQ_ENTRY)str r0, [sp, #(SM_CTX_SEC + SM_SEC_CTX_MON_LR)]/* Restore secure context */add r0, sp, #SM_CTX_SECbl   sm_restore_modes_regsadd    sp, sp, #(SM_CTX_SEC + SM_SEC_CTX_MON_LR)rfefd sp!
UNWIND( .fnend)
END_FUNC sm_fiq_entry

  上面的代码中的ldr r0, =(thread_vector_table + THREAD_VECTOR_TABLE_FIQ_ENTRY)就是用来获取在TEE中用来处理FIQ事件的handle地址,而thread_vector_table从上一章节中可以知道,该变量将会与TEE中真正的FIQ函数关联起来。所以最终会调用到main_fiq函数来进行处理该FIQ事件。等处理完之后,CPU将会重新回到处理前的状态。

1.3 main_fiq函数

  main_fiq函数函数是TEE用来处理FIQ事件的最终函数。该函数定义在optee_os/core/arch/rm/tee/entry_fast.c文件中,函数内如如下:

static void main_fiq(void)
{gic_it_handle(&gic_data);
}

  该函数根据具体的参数和FIQ时间的ID来判定具体需要执行哪些操作,至于具体的操作,以后如果碰到将会具体讲述。

2. OP-TEE中对FIQ事件的处理

  在OP-TEE的初始化的时候会调用thread_init_vbar函数来完成在seure world态的中断向量表的初始化,且在GIC中配置FIQ在secure world态时才有效。所以当在secure world态中产生了FIQ事件的时候,CPU将直接通过VBAR寄存器查找到中断向量表的地址,并命中FIQ的处理函数。整个处理过程如下:

2.1thread_fiq_handler函数

  当在secure world产生了FIQ事件的时候,通过查找中断向量表可以知道,CPU将调用thread_fiq_handler函数,该函数定义在optee_os/core/arch/arm/kernel/thread_a32.S文件中,其内容如下:

LOCAL_FUNC thread_fiq_handler , :
UNWIND( .fnstart)
UNWIND( .cantunwind)
#if defined(CFG_ARM_GICV3)foreign_intr_handler  fiq
#elsenative_intr_handler    fiq
#endif
UNWIND( .fnend)
END_FUNC thread_fiq_handler

  由于没有开启CFG_ARM_GICV3的支持,所以该函数会调用native_intr_handler函数来完成FIQ事件的处理

2.2 native_intr_handle宏

  native_intr_handle宏是用汇编实现的,用来在secure world态中处理FIQ事件。该函数定义在optee_os/core/arch/arm/kernel/thread_a32.S文件中,内容如下:

.macro   native_intr_handler mode:req/** FIQ and IRQ have a +4 offset for lr compared to preferred return* address*/sub     lr, lr, #4/** We're saving {r0-r3}. The banked fiq registers {r8-r12} need to be* saved if the native interrupt is sent as FIQ because the secure* monitor doesn't save those. The treatment of the banked fiq* registers is somewhat analogous to the lazy save of VFP registers.*/.ifc  \mode\(),fiqpush    {r0-r3, r8-r12, lr}.elsepush    {r0-r3, lr}.endifbl thread_check_canaries   //检查栈空间没被破坏ldr  lr, =thread_nintr_handler_ptr  //加载FIQ处理函数的地址到lr寄存器中ldr    lr, [lr]blx lr  //跳转到thread_nintr_handler_ptr函数执行.ifc   \mode\(),fiqpop {r0-r3, r8-r12, lr}.elsepop {r0-r3, lr}.endifmovs   pc, lr
.endm

2.3 main_fiq函数

  在初始化的时候会调用init_handlers函数将thread_nintr_handler_ptr指向handlers->nintr变量,而handlers->nintr的值为main_fiq函数。所以最终会调用到main_fiq来对FIQ事件进行处理。

  main_fiq函数需要根据不同的板级的需要和板级需要处理的FIQ事件类型进行实际的编写和处理,在此就不做详细介绍。

16. OP-TEE中的中断处理(二)------系统FIQ事件的处理相关推荐

  1. linux 中的中断处理

    谈谈对中断的理解 1.裸板中断处理过程 中断属于异常的一种 它是计算机中处理异步事件的重要机制1.1 中断的触发中断源级配置中断的触发方式 上升沿 下降沿 高 低触发中断使能 (监测到中断信号之后,能 ...

  2. Deep Learning Applied to Steganalysis of Digital Images: A Systematic Review 深度学习在数字图像隐写分析中的应用:系统综述

    Deep Learning Applied to Steganalysis of Digital Images: A Systematic Review (深度学习在数字图像隐写分析中的应用:系统综述 ...

  3. 在.NET中进行AutoCAD二次开发(C#+ObjectArx)

    1.Autodesk官方最新的.net教程(一)(C#版): 修正: (1)启用对象浏览器方法: 双击托管的类,会自动调用对象浏览器 (2)调试环境设置: 应设2项,否则调试程序无法运行: 启动外部程 ...

  4. 第五届北大青鸟杯全国IT精英挑战赛华中区一等奖项目——中商百货分销系统_关键代码说明书

    第五届北大青鸟杯全国IT精英挑战赛华中区一等奖项目--中商百货分销系统 关键代码说明书 作者:武汉宏鹏田超凡 版权所有,转载请注明原作者,仿冒侵权必究法律责任 中商百货分销商城关键代码说明...... ...

  5. QT 中的 Graphics View 系统

    这个框架是一个相对成熟的渲染引擎的上层框架,通常也可以会叫做 Scene - View. 在QT中,GraphicsView是一个与QWdiget系列一点点不一样的系统.这个系统主要由下面几个框架类构 ...

  6. 炼数成金数据分析课程---16、机器学习中的分类算法(交叉内容,后面要重点看)...

    炼数成金数据分析课程---16.机器学习中的分类算法(交叉内容,后面要重点看) 一.总结 一句话总结: 大纲+实例快速学习法 主要讲解常用分类算法(如Knn.决策树.贝叶斯分类器等)的原理及pytho ...

  7. 详解在Visual Studio中使用git版本系统 [转]

    详解在Visual Studio中使用git版本系统    作者:掷鸡蛋者 , 发布于2012-6-21   这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指 ...

  8. ad20中怎么多选操作改层_AD20中19个常用系统快捷键小节

    AD20中19个常用系统快捷键小节 Altium Designer自带很多组合快捷键,可以多次执行字母按键组合成需要的操作,很是方便.那么组合快捷键如何得来呢? 其实,系统的组合快捷键都是依据菜单中命 ...

  9. (翻译)开始iOS 7中自动布局教程(二)

     (翻译)开始iOS 7中自动布局教程(二) 这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行 ...

最新文章

  1. WebApi2官网学习记录---异常处理
  2. 北大教授杨超、清华教授唐杰获首届“王选杰出青年学者奖”
  3. SAP MMBE库存数量与在库序列号数量差异之处理
  4. java reference详解_Java Reference详解
  5. ArcGIS网络分析之Silverlight客户端最近设施点分析(四)
  6. latex 三线表_LaTeX学习记录(3):使用图表
  7. matlab将矩阵分解成lu,10行代码实现矩阵的LU分解(matlab)
  8. 红米性价比之王宣布!网友:干翻友商小米、干翻友商荣耀
  9. mongodb 添加用户及权限设置详解
  10. angular NG-ZORRO 跑马灯左右控件
  11. 格式化一个文件的大小(size),或者说是格式化一个app的大小(size)
  12. postman工具 如何传递当前时间戳和MD5加密
  13. 概率论——离散型随机变量
  14. android多媒体框架学习
  15. Origin2021学习版申请与安装
  16. 国密SM2系列算法验证工具
  17. FreeRTOS死机原因
  18. 微信公众号开发之生成带参数的二维码
  19. 100个c#初学者编程实例_C#编程:初学者入门
  20. 爱因斯坦广义相对论:引力是时空的曲率

热门文章

  1. 前端UI框架Ant Design Pro 依赖安装
  2. python-按首字母分类形成列表
  3. 单个视频二维码生成与列表二维码生成(完整版)
  4. 【CGE】“双碳”目标下资源环境中的可计算一般均衡CGE模型应用
  5. 腾讯云服务器文件解压,使用腾讯云函数SCF快速解压对象存储COS中的ZIP文件
  6. GaN/氮化镓65W(1A2C)PD快充电源方案
  7. 家庭华硕路由器如何实现NAT硬件加速?本文让您从入门到精通
  8. matlab隐函数画三维图,MATLAB绘制3D隐函数曲面的几种方法
  9. 生鲜商超行业如何通过微信提升盈利?
  10. VScode修改文件编码