<OPTEE>Trusted Application结构分析

本文介绍如何为OpteeOS开发受信应用(TA),包括TA的基本结构、关键文件的作用及其实现细节。通过一个简单的存储示例,展示了如何定义命令及其实现。

最近又开始和Trusted Zone打起了交道,需要把Linaro开发的开源安全系统optee os移植到实验室的老板子上。不过导师要求我先开发一个应用,在普通环境和安全环境分别有一个程序,称为host与trusted application(简称TA)。让我在这个过程中了解一下这个系统。

  optee os的github地址:https://github.com/OP-TEE/optee_os,一天几个commit,那几个大神真是勤劳。

  不管怎么说,我要先搞清楚这个应用的结构,幸好这个项目还带有一个测试工具集optee test ,这个测试肯定包含host和TA两端,所以可以从这里入手学习。

  host就是一个普通的可执行文件,除了调用了TEE的Api,没什么特别的。

  TA端是OPTEE中运行的程序,有他的要求,下面以一个简单的测试存储的TA——storage为例介绍他的基本结构。

  程序文件

  

  include目录下的头文件  

  

  可以看到所需的文件并不多。简要介绍一下,makefile和sub.mk自不必说,storage.c写的是一些简单的调用TEE存储API的逻辑。

  ta_entry.c比较重要,是TA的入口,里面主要是

  TA_CreateEntryPoint,

  TA_DestroyEntryPoint,

  TA_OpenSessionEntryPoint,

  TA_CloseSessionEntryPoint,

  TA_InvokeCommandEntryPoint

  几个函数,是作用通过名字即可看出,在<tee_ta_api.h>中早有定义,每一个TA都要各自实现这几个函数,不过代码量很小,一般不需要写逻辑,声明出来,处理参数不要报错就行。其中的TA_InvokeCommandEntryPoint主体是一个switch,用传入的命令ID判断和分发。

  Ta_storage.h

复制代码
#ifndef TA_STORAGE_H
#define TA_STORAGE_H
#define TA_STORAGE_UUID { 0xb689f2a7, 0x8adf, 0x477a, \
    { 0x9f, 0x99, 0x32, 0xe9, 0x0c, 0x0a, 0xd0, 0xa2 } }

#define TA_STORAGE_CMD_OPEN           0
#define TA_STORAGE_CMD_CLOSE          1
#define TA_STORAGE_CMD_READ           2
#define TA_STORAGE_CMD_WRITE          3
#define TA_STORAGE_CMD_CREATE         4
#define TA_STORAGE_CMD_SEEK           5
#define TA_STORAGE_CMD_UNLINK         6
#define TA_STORAGE_CMD_RENAME         7
#define TA_STORAGE_CMD_TRUNC          8
#define TA_STORAGE_CMD_ALLOC_ENUM     9
#define TA_STORAGE_CMD_FREE_ENUM      10
#define TA_STORAGE_CMD_RESET_ENUM     11
#define TA_STORAGE_CMD_START_ENUM     12
#define TA_STORAGE_CMD_NEXT_ENUM      13

#endif /*TA_SKELETON_H */
复制代码

  上面定义了该TA的UUID, 以及各个命令的宏。OPTEE通过UUID唯一标识系统里的TA,因此这个UUID不能重复,这里建议的是通过网站ITU-T UUID generator

http://www.itu.int/ITU-T/asn1/uuid.html)来创建唯一的ID,而且生成的数据长度和OPTEE的要求是一致的,只要按格式拆分就可以了。

 

  上述命令在TA_InvokeCommandEntryPoint函数中用switch分发命令调用,处理请求的实现写在storage.c中。

复制代码
TEE_Result TA_InvokeCommandEntryPoint(void *pSessionContext,
                      uint32_t nCommandID, uint32_t nParamTypes,
                      TEE_Param pParams[4])
{
    (void)pSessionContext;

    switch (nCommandID) {
    case TA_STORAGE_CMD_OPEN:
        return ta_storage_cmd_open(nParamTypes, pParams);

    case TA_STORAGE_CMD_CLOSE:
        return ta_storage_cmd_close(nParamTypes, pParams)

        //......
}        
复制代码

  

  user_ta_header_defines.h,TA的头部信息,主要是UUID和一些空间信息。 

复制代码
#ifndef USER_TA_HEADER_DEFINES_H
#define USER_TA_HEADER_DEFINES_H

#include <ta_storage.h>

#define TA_UUID TA_STORAGE_UUID

/*
 * This is important to have TA_FLAG_SINGLE_INSTANCE && !TA_FLAG_MULTI_SESSION
 * as it is used by the ytest
 */
#define TA_FLAGS        (TA_FLAG_USER_MODE | TA_FLAG_EXEC_DDR | \
                TA_FLAG_SINGLE_INSTANCE)
#define TA_STACK_SIZE        (2 * 1024)
#define TA_DATA_SIZE        (32 * 1024)  
复制代码

  

  在optee_os/../kernel tee_ta_Manager.c里面,tee_ta_init_static_ta_session函数中定义TA头部结构体类型,在OPTEE收到Host端的请求,准备初始化会话,加载对应的TA时,会创建一个TA指针,在循环中从内存中定义的start到stop移动,依次比对UUID,从而获取所需的TA头部指针,然后调用tee_ta_load函数,检查签名,加载待运行的TA。

复制代码
static TEE_Result tee_ta_init_static_ta_session(const TEE_UUID *uuid,
                struct tee_ta_session *s)
{
    struct tee_ta_ctx *ctx = NULL;
    ta_static_head_t *ta = NULL;

    DMSG("   Lookup for Static TA %08x-%04x-%04x",
         uuid->timeLow, uuid->timeMid, uuid->timeHiAndVersion);

    ta = &__start_ta_head_section;
    while (true) {
        if (ta >= &__stop_ta_head_section)
            return TEE_ERROR_ITEM_NOT_FOUND;
        if (memcmp(&ta->uuid, uuid, sizeof(TEE_UUID)) == 0)
            break;
        ta++;
    }
        //......
}
复制代码

 

  所以新增的TA应该预先把自己的头部结构体放在区间内,经过分析,只要在编译完成后,把.ta文件预先放在rootfs下的lib/optee_armtz/目录内即可,运行时,系统将把这个目录下的TA的头部都加载到内存中以供查找。至于如何打包,最好的方式还是通过修改makefile中Root FS部分内容,这样每次编译完都会把.ta打包入镜像。
  以上就是一个简单的TA项目基本的结构介绍和分析,更详细的代码请自行到github查看。

  optee_os

  optee test

 


原文地址: http://www.cnblogs.com/aureate-sunshine/p/5341967.html

<think> 我们讨论的是Apache Batik库,特别是batik-all依赖。以下将详细介绍其使用、版本问题和依赖冲突解决等。 ### 1. Batik库概述 **Apache Batik** 是一个基于Java的SVG(可缩放矢量图形)处理工具包,提供以下核心功能: - SVG解析与渲染(支持SVG 1.1/1.2规范) - SVG转PNG/JPEG/TIFF等光栅格式 - SVG DOM操作与动画支持 - 字体处理和文本布局 ### 2. Maven依赖配置 标准`batik-all`依赖声明(最新稳定版): ```xml <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-all</artifactId> <version>1.16</version> <!-- 截至2023年最新版 --> <type>pom</type> <!-- 注意:这是POM类型依赖 --> </dependency> ``` **关键说明**: - `batik-all`是一个**聚合POM**(packaging为`pom`),它会引入Batik所有子模块[^1][^2] - 实际依赖范围包括: - `batik-anim` - `batik-awt-util` - `batik-bridge` - ...(共30+模块) ### 3. 版本选择策略 | 版本 | 发布时间 | JDK要求 | 特性说明 | |----------|----------|---------------|----------------------------------| | `1.16` | 2022 | Java 8+ | 支持CSS3选择器、修复内存泄漏[^3] | | `1.14` | 2020 | Java 8+ | 安全补丁,性能优化 | | `1.10` | 2018 | Java 7+ | 长期支持版本(LTS) | > **推荐**:新项目使用`1.16`;维护旧系统可选`1.14`(仍有安全更新) ### 4. 基础使用示例 #### SVG转PNG ```java import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; public class SvgToPng { public static void convert(String svgPath, String pngPath) throws Exception { PNGTranscoder transcoder = new PNGTranscoder(); TranscoderInput input = new TranscoderInput(new FileInputStream(svgPath)); TranscoderOutput output = new TranscoderOutput(new FileOutputStream(pngPath)); transcoder.transcode(input, output); } } ``` ### 5. 依赖冲突解决 Batik依赖树复杂,常见冲突包括: #### 5.1 XML解析器冲突 - **症状**:`java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser` - **原因**:Batik默认依赖Xerces,但项目可能使用其他解析器(如Woodstox) - **解决方案**: ```xml <!-- 排除内置Xerces --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-all</artifactId> <version>1.16</version> <type>pom</type> <exclusions> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> <exclusion> <groupId>org.apache.xmlgraphics</groupId> <artifactId>xml-apis-ext</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加统一解析器 --> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.2</version> </dependency> ``` #### 5.2 字体处理冲突 - **症状**:渲染中文乱码或`Font not found`错误 - **修复方案**: ```java // 代码中注册系统字体 FontManager.getInstance().registerFont(new File("fonts/simhei.ttf")); ``` ### 6. 性能优化建议 1. **启用缓存**:对重复渲染操作使用`RenderingHints.KEY_BUFFERED_IMAGE` ```java PNGTranscoder transcoder = new PNGTranscoder(); transcoder.addTranscodingHint(PNGTranscoder.KEY_ALLOWED_IMAGE_TYPES, new String[]{"image/png"}); ``` 2. **限制解析资源**:防止恶意SVG攻击 ```java SecurityManager securityManager = new BatikSecurityManager(); securityManager.setAllowedExternalResources(new String[]{"https://trusted.com/"}); ``` ### 7. 兼容性警告 - **Java 17+**:Batik 1.16需添加JVM参数解决模块访问问题[^4] ``` --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/sun.awt=ALL-UNNAMED ``` §§相关问题§§ 1. Batik如何处理SVG动画的渲染? 2. 在Spring Boot项目中如何集成Batik? 3. Batik与JavaFX的SVG渲染有何性能差异? 4. 如何解决Batik在Linux服务器上无图形界面的渲染问题? [^1]: Apache Batik官方文档 [^2]: Maven Central仓库元数据 [^3]: Batik 1.16 Release Notes [^4]: Java模块系统兼容性报告 </think> ### Apache Batik 全解析:SVG 处理核心库 Apache Batik 是 Java 生态中处理 SVG(可缩放矢量图形)的顶级工具库,`org.apache.xmlgraphics:batik-all` 是所有 Batik 模块的聚合依赖。以下是关键信息和使用指南: --- #### 一、核心功能概览 | 功能模块 | 描述 | 典型应用场景 | |-------------------|----------------------------------------------------------------------|-----------------------------| | **SVG 渲染** | 将 SVG 文件渲染为 PNG/JPEG/TIFF 等位图格式 | 报表导出、动态图像生成 | | **SVG DOM 操作** | 通过 W3C DOM API 解析和操作 SVG 文档 | SVG 内容动态修改 | | **字体处理** | 支持 TTF/OTF 字体嵌入与文本布局 | 多语言 SVG 生成 | | **动画支持** | 解析和执行 SVG SMIL 动画 | 动态图形展示 | | **扩展插件** | 提供滤镜、渐变等高级 SVG 特性 | 复杂视觉效果实现 | --- #### 二、Maven 依赖配置 ##### 基础配置(最新稳定版): ```xml <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-all</artifactId> <version>1.16</version> <!-- 2023年发布 --> <type>pom</type> <!-- 注意:这是聚合POM依赖 --> </dependency> ``` ##### 版本选择建议: | 版本 | JDK 要求 | 关键特性 | 推荐场景 | |---------|----------|----------------------------------|------------------| | `1.16` | Java 8+ | CSS3 选择器支持,内存泄露修复 | 新项目首选 | | `1.14` | Java 7+ | 安全补丁,性能优化 | 旧系统维护 | | `1.10` | Java 6+ | 长期支持版(LTS) | 遗留系统兼容 | > **注**:`batik-all` 是 [POM 类型依赖](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#dependency-types),会自动引入所有子模块(约 28 个 jar) --- #### 三、基础使用示例 ##### SVG 转 PNG 格式: ```java import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; public class SvgToPngConverter { public static void convert(String svgPath, String pngPath) throws Exception { PNGTranscoder transcoder = new PNGTranscoder(); // 设置输出参数 transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, 500f); try (InputStream in = new FileInputStream(svgPath); OutputStream out = new FileOutputStream(pngPath)) { TranscoderInput input = new TranscoderInput(in); TranscoderOutput output = new TranscoderOutput(out); transcoder.transcode(input, output); // 执行转换 } } } ``` --- #### 四、典型依赖冲突解决方案 ##### 1. XML 解析器冲突(Xerces vs. Batik) **症状**:`java.lang.ClassNotFoundException: org.apache.xerces.parsers.SAXParser` **修复**:排除冲突依赖并统一版本 ```xml <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-all</artifactId> <version>1.16</version> <type>pom</type> <exclusions> <!-- 排除旧版 XML-APIs --> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> </exclusions> </dependency> <!-- 手动添加新版 --> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> <version>2.12.2</version> </dependency> ``` ##### 2. 字体渲染问题 **症状**:中文乱码或 `Font not found` 错误 **解决方案**:手动注册字体 ```java // 在初始化时执行 FontManager fm = FontManager.getManager(); fm.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("fonts/simhei.ttf"))); ``` --- #### 五、性能优化建议 1. **启用缓存**(重复渲染场景): ```java transcoder.addTranscodingHint(PNGTranscoder.KEY_ALLOWED_IMAGE_TYPES, new String[]{"image/png"}); ``` 2. **限制解析资源**(防恶意 SVG): ```java SecurityManager securityManager = new BatikSecurityManager(); securityManager.setAllowedExternalResources(new String[]{"https://trusted.com/"}); ``` 3. **关闭不需要的模块**: ```xml <!-- 单独引入所需模块代替 batik-all --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-transcoder</artifactId> <version>1.16</version> </dependency> ``` --- #### 六、Java 17+ 兼容性问题 **症状**:`java.lang.reflect.InaccessibleObjectException` **解决方案**:添加 JVM 参数 ``` --add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/sun.awt=ALL-UNNAMED ``` > **最佳实践**:对于新项目,建议使用轻量级子模块(如 `batik-transcoder`)而非完整 `batik-all`[^1][^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值