添加系統(tǒng)服務(wù)
系統(tǒng)服務(wù)的添加不是必需的,為方便對底層驅(qū)動的管理和對外部設(shè)備的擴(kuò)展,可將安全驅(qū)動的接口接入到某個系統(tǒng)服務(wù)中,通過系統(tǒng)服務(wù)向外界暴露調(diào)用接口,以便上層TA可以使用該安全驅(qū)動。
在本示例中建立的系統(tǒng)服務(wù)的源代碼為tee_test.c文件,需將該文件保存到optee_os/core/tee目錄中,同時將tee_test.h文件保存到optee_os/core/include/tee目錄中,然后修改optee_os/core/tee目錄中的sub.mk文件,添加“srcs-y += tee_test.c”,將tee_test.c集成到編譯系統(tǒng)中。
也可使用宏來控制該系統(tǒng)服務(wù)的編譯,其實(shí)現(xiàn)方法與上一節(jié)相同。
在tee_test.c文件中使用service_init宏來定義該系統(tǒng)服務(wù)的初始化函數(shù)(tee_test_init),該初始化函數(shù)將會被編譯到OP-TEE的初始化段中,OP-TEE啟動時將會執(zhí)行服務(wù)段中包含的函數(shù),調(diào)用tee_test_init函數(shù)初始化該系統(tǒng)服務(wù)。
到這里明白了driver_init和service_init的差異。一個是直接注冊驅(qū)動的系統(tǒng)調(diào)用,一個注冊到系統(tǒng)服務(wù)。
3.4 添加系統(tǒng)調(diào)用
上層的TA運(yùn)行于OP-TEE的用戶空間,如果上層的TA需要調(diào)用安全驅(qū)動,則需通過調(diào)用系統(tǒng)調(diào)用接口的方式來調(diào)用安全驅(qū)動提供的操作接口。
若要在TA中使用本示例中的安全驅(qū)動,則還需在OP-TEE中增加該驅(qū)動對應(yīng)的系統(tǒng)調(diào)用。包括用戶空間接口的定義和內(nèi)核空間接口的定義,關(guān)于OP-TEE中系統(tǒng)調(diào)用的實(shí)現(xiàn)原理可參閱第16章。(小的馬上后面補(bǔ)上)
1.用戶空間代碼的修改
修改optee_os/lib/libutee/arch/arm/utee_syscalls_asm.S文件,添加如下內(nèi)容:
UTEE_SYSCALL utee_testDriver_write, TEE_SCN_TESTDRIVER_WRITE,3
UTEE_SYSCALL utee_testDriver_read, TEE_SCN_TESTDRIVER_READ,3
UTEE_SYSCALL utee_testDriver_dump, TEE_SCN_TESTDRIVER_DUMP,2
utee_testDriver_xxx是在TA中調(diào)用該驅(qū)動時使用的函數(shù),
TEE_SCN_TESTDRIVER_XXX是該系統(tǒng)調(diào)用對應(yīng)的索引值。
上層TA調(diào)用utee_testDriver_xxx函數(shù)后會進(jìn)入OP-TEE的內(nèi)核空間,系統(tǒng)通過查找TEE_SCN_TESTDRIVER_XXX對應(yīng)的接口來找到該功能在OP-TEE內(nèi)核中的實(shí)現(xiàn)。
最后的數(shù)字表示調(diào)用該接口時需要代入的參數(shù)的個數(shù)。
修改optee_os/lib/libutee/include/utee_syscalls.h文件,添加如下內(nèi)容,申明上述三個函數(shù)接口。在TA的源代碼中包含該頭文件后就可調(diào)用這三個接口來對該安全驅(qū)動進(jìn)行調(diào)用。
TEE_Result utee_testDriver_write(void*buf,size_t blen,size_t offset);
TEE_Result utee_testDriver_read(void*buf,size_t blen,size_t offset);
TEE_Result utee_testDriver_dump(void*buf,size_t blen);
修改optee_os/lib/libutee/include/tee_syscall_numbers.h文件,添加上述三個系統(tǒng)調(diào)用接口的索引值,并修改TEE_SCN_MAX的值,需要修改和添加的內(nèi)容如下:
#define TEE_SCN_TESTDRIVER_WRITE 71
#define TEE_SCN_TESTDRIVER_READ 72
#define TEE_SCN_TESTDRIVER_DUMP 73
#define TEE_SCN_MAX 73
2.內(nèi)核空間代碼的修改
修改optee_os/core/arch/arm/tee/arch_svc.c文件中系統(tǒng)調(diào)用數(shù)組變量tee_svc_syscall_table的內(nèi)容,將上述系統(tǒng)調(diào)用對應(yīng)的內(nèi)核層接口添加到該數(shù)組中,并包含申明這三個接口的頭文件,在該文件中添加的內(nèi)容如下:
SYSCALL_ENTRY(syscall_testDriver_write),
SYSCALL_ENTRY(syscall_testDriver_read),
SYSCALL_ENTRY(syscall_testDriver_dump),
#include<tee/tee_test.h >
上述三個函數(shù)的具體實(shí)現(xiàn)在tee_test.c文件中,讀者可自行查閱這三個接口函數(shù)的實(shí)現(xiàn)。
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1841瀏覽量
85329 -
設(shè)備
+關(guān)注
關(guān)注
2文章
4517瀏覽量
70682 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68694 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1017瀏覽量
21366
發(fā)布評論請先 登錄
相關(guān)推薦
評論