runtime_svc_init函数该函数主要用来建立安全监控模式调用处理函数的索引表,并执行el3中提供的服务项的初始化操作,获取tee os的入口地址并赋值给bl32_init变量,以备启动tee os。
而这些处理函数是通过declare_rt_svc宏定义被编译到镜像文件的rt_svc_descs段中的。
void runtime_svc_init(void) { int rc = 0, index, start_idx, end_idx; /*判定rt_svc_descs段中service条数的是否超出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数组中的数据成-1,表示当前所有的service无效*/ memset(rt_svc_descs_indices, -1, sizeof(rt_svc_descs_indices)); /* 获取第一条el3 service在ram中的起始地址,通过获取rt_svc_descs_start的值来确定, 该值在链接文件中有定义 */ rt_svc_descs = (rt_svc_desc_t *) rt_svc_descs_start; /* 遍历整个rt_svc_des段,将其call type与rt_svc_descs_indices中的index建立对应 关系 */ for (index = 0; index < rt_svc_decs_num; index++) { rt_svc_desc_t *service = &rt_svc_descs[index]; /* 判定在编译时注册的service是否有效 */ rc = validate_rt_svc_desc(service); if (rc) { error(invalid runtime service descriptor %pn, (void *) service); panic(); } /* 执行当前service的init的操作 */ if (service- >init) { rc = service- >init(); if (rc) { error(error initializing runtime service %sn, service- >name); continue; } } /* 根据该service的call type以及start oen来确定唯一的index,并且将该service 中支持的所有call type生成唯一的标识映射到同一个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该宏用来在编译时将el3中的service编译进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 }该宏中的各种参数说明如下:
• □ start_oen:该service的起始内部编号;• □ end.oen:该service的末尾编号;• □ call_type:调用的smc的类型;• □ name:该service的名字;• □ init:该service在执行之前需要被执行的初始化操作;• □ handle:当触发了call type的调用时调用的处理该请求的函数。
基于VHDL、FPGA实现智能控制器的设计与开环测试
人工智能开发流程将成为IT领域最环保的可持续发展平台
机智云快速打造电风扇智能化解决方案 为用户提供更好地智能服务
OPPO首款5G手机亮相上半年发布,10倍混合光学变焦技术Q2量产
如何设置Arduino IDE、连接开发板以及上传第一个草图
ATF中bl31函数介绍与使用
主板高速串行总线解析与测试需求分析示波器
如何仅在两个Aduino之间进行2路I²C通信
几种二极管的检测方法(桥堆,硅堆,变阻,肖特基二极管)
热敏干簧继电器的特点 热敏干簧继电器的选型
中国智慧城市国际博览会于深圳盛大开幕
现场免拆卸的立磨轴承座维修方法
铠侠推出第二代UFS 4.0嵌入式闪存设备
USB电路的设计方法解析
Stream模块的基础用法和进阶用法
亚马逊或将在英国开设一家无收银便利店
Epic对谷歌和苹果的诉讼被广泛关注
步步向前,曙光已现:百度的大模型之路
2019年医疗电子展望
基于Rust语言中的生命周期