感谢 帅峰云 博主的教程,书已购买讲的很细致:https://blog.csdn.net/shuaifengyun/article/details/71499619
感谢 技术宅阿棍儿 up主的视频,已三连投币:https://www.bilibili.com/video/av55057371/
上一篇搭建了 Qemu & OPTEE 的运行环境,并且运行了 ~/optee/optee_examples/hello_world 中的示例代码。
我们想向 OPTEE环境中添加自己的 TA/CA,最简单的方法当然是找示例代码作为模板,修改关键内容并且添加自己的代码段。
一、示例代码的目录结构
先来看下 ~/optee/optee_examples/hello_world 示例代码的目录结构:
左侧为 示例代码 hello_world的目录结构,上边为其中比较重要的文件。
host 文件夹存放的是 CA的代码,重要文件是 main.c。
ta 文件夹存放的是 TA的代码,重要文件是 hello_world_ta.c。
各个目录下都有一个 Makefile,清一色的编译套路,稍作修改即可。
二、复制代码
复制代码前,因为以前文件中有很多中间文件,需要先清理一下。
git clean -fx
之后翻看了下 host 和 ta 的文件,少了很多以前的中间文件。
创建 ~/optee/optee_examples/mytest 文件夹,将 hello_world 中的文件都复制过来。
使用 Vscode - 文件 - 打开文件夹 - ,进入这个工作目录。
三、编辑文件,替换代码内容
./host/main.c:
main.c 中主要的内容有:
res = TEEC_InitializeContext(NULL, &ctx);
res = TEEC_OpenSession(&ctx, &sess, &uuid,
TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
res = TEEC_InvokeCommand(&sess, TA_HELLO_WORLD_CMD_INC_VALUE, &op,
&err_origin);
TEEC_CloseSession(&sess);
TEEC_FinalizeContext(&ctx);
我们对如下进行修改,先是 CTRL + F 搜索 hello,然后将 hello world 改为 mytest,大写同理。
36 44 53 82 86 行有改动,三处注释三处代码。
./host/Makefile:
没什么改动,只需要改下输出可执行文件名称。
./ta/include/hello_world_ta.h:
将 ./ta/include/hello_world_ta.h 重命名为 mytest_ta.h。
依然是 CTRL + F 搜索 hello,然后将 hello world 改为 mytest,大写同理。
然后修改 UUID,按照注释的提示,UUID生成器链接:http://www.itu.int/ITU-T/asn1/uuid.html
上边的链接打开很慢,最后还是要跳转到这个链接,这个打开很快:https://www.uuidgenerator.net/
7c07d8be-244a-4491-8f26-0d1d8f2dd4e7
复制,对照着修改。使用网页生成器生成的 UUID能保证唯一性,不会与别人发布的冲突。
UUID可以自行随意修改,但如果需要发布,可能会与他人的造成冲突。只能用于本地个人测试。
./ta/sub.mk:
将指定的源文件,改为 mytest_ta.c。
./ta/hello_world_ta.c:
将 ./ta/hello_world_ta.c 重命名为 mytest_ta.c。
继续 CTRL + F 搜索 hello,然后将 hello world 改为 mytest,大写同理。
找到 static TEE_Result inc_value ,修改运算逻辑。
./ta/Makefile:
修改 UUID
./ta/user_ta_header_defines.h:
头文件、和UUID宏的名称
下面第 45行的内容暂且先不要修改。
四、将此文件夹添加进编译列表中
修改 ~/optee/optee_examples/Makefile,把 mytest 添加进去。Esc,:wq 保存退出。
五、编译 运行
回到目录 ~/optee/build 下。
make run
按 c ,回车。
optee_hello_world
optee_mytest