This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

请问在armv8上如何在EL3级别访问EL1的虚拟内存?

请问如果EL1里面运行的内核调用了一个SMC指令(通过SMC去请求secure world的服务),然后这个调用被运行在EL3的ARM-Trusted-Firmware(EL3运行的相当于monitor)接收到了,这个时候EL3能否按照EL1的地址映射方式去访问EL1里面的虚拟内存?(在访问的时候还没有切换到secure os的context)

比如,EL1里面运行的是linux内核,linux内核空间的虚拟地址为addr1(比如sys_call_table),然后我试图在EL3里面直接通过

memcpy(dest, addr1_of_sys_call_table, size);

这种方式来访问,但是导致系统卡住了,也没有提示访问错误之类的。

我是在smc_handler一开始就访问的,所以应该不会存在什么context破坏的问题(TTBR0_EL1, TTBR0_EL3我都没有动过),除非是smc调用本身会造成一些context的转换,又或者是因为EL3级别使用的是TTBR0_EL3而不是TTBR0_EL1? 如果是这样的话,可以强行暂时把TTBR0_EL1的值赋给TTBR0_EL3然后去直接访问addr1_of_sys_call_table吗?

如果不可以的话,那请问有什么办法在EL3(monitor)级别或者secure-EL1(secure os)级别访问到EL1(normal world)的一些资源呢?

我对于这块还只能算是初学者,提前谢谢大家!

Parents
  • ethanzhang的基础上在补充一下。

    每个EL, 还有同一个EL(比如EL1)的secure和non-secue下都有自己TTBR, MMU和Cache的配置。

    kernel代码在执行SMC切换到EL3, ARM trusted firmware里面后,会使用自己的MMU,TTBR0_EL3的配置。

    若涉及到memory访问,需要传递物理地址。

    有个代码的例子,供参考:

    Linux kernel传递指针给ARM trusted firmware的时候,是物理地址。 比如PSCI CPU ON的代码:

    arch/arm64/kernel/psci.c

    static int cpu_psci_cpu_boot(unsigned int cpu)

    {

        int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));

         ......

    }

    不了解你想在EL3访问non-secure EL1的什么资源? 假如是memory的话,只要传递PA就可以了,当然EL3的MMU要配置好。

Reply
  • ethanzhang的基础上在补充一下。

    每个EL, 还有同一个EL(比如EL1)的secure和non-secue下都有自己TTBR, MMU和Cache的配置。

    kernel代码在执行SMC切换到EL3, ARM trusted firmware里面后,会使用自己的MMU,TTBR0_EL3的配置。

    若涉及到memory访问,需要传递物理地址。

    有个代码的例子,供参考:

    Linux kernel传递指针给ARM trusted firmware的时候,是物理地址。 比如PSCI CPU ON的代码:

    arch/arm64/kernel/psci.c

    static int cpu_psci_cpu_boot(unsigned int cpu)

    {

        int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));

         ......

    }

    不了解你想在EL3访问non-secure EL1的什么资源? 假如是memory的话,只要传递PA就可以了,当然EL3的MMU要配置好。

Children