【问题标题】:Passing function pointers from Kernel driver to Hypervisor将函数指针从内核驱动程序传递到 Hypervisor
【发布时间】:2013-12-10 13:07:43
【问题描述】:

我正在尝试使用 SMC 调用将函数指针从 EL1(Android 内核)传递到 EL2(管理程序),并在管理程序中捕获 SMC 调用。我知道仅仅传递 Hypervisor 的指针是行不通的,因为它是一个 VA,对 Hypervisor 没有任何意义。

关于如何做到这一点的任何cmets?我想从 EL2 调用函数,而不是从 EL1。

我的猜测是我可能需要使用 ion memory 或者可能需要转换 VA -> IPA/PA

感谢任何帮助或指点,谢谢!

【问题讨论】:

    标签: linux arm function-pointers hypervisor trust-zone


    【解决方案1】:

    通常,您不希望保留以这种方式传递的指针。最好传递一个缓冲区索引并将其复制到监视器部分。如果正常的操作系统恢复,指向的内存可能会改变,这会导致各种溢出和条件检查被避免。

    因此,如果可能,通常最好按值传递信息。如果必须传递缓冲区,最好在正常和安全世界之间共享的内存中使用一些无锁结构。缓冲区是固定的和索引的。 SMC 调用是为了让安全世界知道状态变化。它复制缓冲区并更新共享内存中的结构以表示它是空闲的。然后在私有副本中验证缓冲区并执行操作。

    一般来说,对normal world address 采取行动并不是一个好主意。这很容易出错,应该避免。这就是为什么微内核使用消息传递来一直复制缓冲区的原因。

    【讨论】:

    • 感谢@artless_noise 我完全理解在安全和非安全世界之间传递指针的担忧。但是我在这里尝试的是看看我是否可以调用 EL1 内核模块驱动程序中存在的函数,以便从更高特权级别 EL2(管理程序)调用这对你来说似乎可行吗?我知道它有很多安全问题,但我这样做只是为了好玩! :) 谢谢,非常感谢您的宝贵时间。
    • 您可以将物理地址添加到您的 SMC API 并将其映射到安全世界。我认为您无权访问虚拟地址。 EL1 和 EL2 命名似乎是 AAarch64 特定的。如果你想得到答案,那么你应该更新你的问题。注意:Hypervisor 不同于trust-zone;它们相似,但不同。见hypervisor vs trustzone
    • 您所说的“在安全世界中映射”是什么意思?抱歉,但我是这个 linux 世界的新手,仍处于学习阶段。我有一个 TZ 和 Hyp 的系统已经编程并且可以正常工作。目的是在 Hyp 中捕获 SMC 调用并调用内核驱动程序中的函数
    • Linux 虚拟地址对管理程序没有意义。您应该传递一个物理地址。您可以将通用宏 virt_to_phys()kmalloc() 指针一起使用。将此传递给 SMC 接口。在安全世界中,如果您启用了 MMU,则需要将该物理地址映射 到虚拟地址(通过安全 MMU)。如果安全世界没有 MMU,那么您只需使用物理地址。我认为 Linux 是正常的世界。
    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多