TEE (可信执行环境) 驱动 API

内核提供了一个 TEE 总线基础设施,其中可信应用程序表示为一个通过通用唯一标识符 (UUID) 标识的设备,客户端驱动程序注册一个支持的设备 UUID 表。

TEE 总线基础设施注册以下 API

match()

遍历客户端驱动程序 UUID 表,以查找与设备 UUID 对应的匹配项。 如果找到匹配项,则通过客户端驱动程序注册的相应探针 API 探针此特定设备。 每当设备或客户端驱动程序在 TEE 总线上注册时,都会发生此过程。

uevent()

每当新设备在 TEE 总线上注册时,都会通知用户空间 (udev),以便自动加载模块化客户端驱动程序。

TEE 总线设备枚举特定于底层 TEE 实现,因此 TEE 驱动程序可以提供相应的实现。

然后,TEE 客户端驱动程序可以使用 include/linux/tee_drv.h 中列出的 API 与匹配的可信应用程序通信。

TEE 客户端驱动程序示例

假设 TEE 客户端驱动程序需要与 UUID 为 ac6a4085-0e82-4c33-bf98-8eb8e118b6c2 的可信应用程序通信,因此驱动程序注册代码段如下所示

static const struct tee_client_device_id client_id_table[] = {
        {UUID_INIT(0xac6a4085, 0x0e82, 0x4c33,
                   0xbf, 0x98, 0x8e, 0xb8, 0xe1, 0x18, 0xb6, 0xc2)},
        {}
};

MODULE_DEVICE_TABLE(tee, client_id_table);

static struct tee_client_driver client_driver = {
        .id_table       = client_id_table,
        .driver         = {
                .name           = DRIVER_NAME,
                .bus            = &tee_bus_type,
                .probe          = client_probe,
                .remove         = client_remove,
        },
};

static int __init client_init(void)
{
        return driver_register(&client_driver.driver);
}

static void __exit client_exit(void)
{
        driver_unregister(&client_driver.driver);
}

module_init(client_init);
module_exit(client_exit);