【发布时间】:2017-10-18 22:42:12
【问题描述】:
我一直在阅读 Android 的内核,以了解 CPU 内核(又名 DVFS、DCVS)的动态电源管理是如何完成的。我找到的代码here 调用了以下函数(定义为here),该函数又调用了SMC 汇编指令。
ARM 有一个解释 SMC calling convention 的文档,但我无法使用它来理解以下功能。如何进一步追踪 SMC 指令,以根据其输入操作数查看它实际执行的操作?
s32 scm_call_atomic4_3(u32 svc, u32 cmd, u32 arg1, u32 arg2,
u32 arg3, u32 arg4, u32 *ret1, u32 *ret2)
{
int ret;
int context_id;
register u32 r0 asm("r0") = SCM_ATOMIC(svc, cmd, 4);
register u32 r1 asm("r1") = (u32)&context_id;
register u32 r2 asm("r2") = arg1;
register u32 r3 asm("r3") = arg2;
register u32 r4 asm("r4") = arg3;
register u32 r5 asm("r5") = arg4;
asm volatile(
__asmeq("%0", "r0")
__asmeq("%1", "r1")
__asmeq("%2", "r2")
__asmeq("%3", "r0")
__asmeq("%4", "r1")
__asmeq("%5", "r2")
__asmeq("%6", "r3")
#ifdef REQUIRES_SEC
".arch_extension sec\n"
#endif
"smc #0 @ switch to secure world\n"
: "=r" (r0), "=r" (r1), "=r" (r2)
: "r" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5));
ret = r0;
if (ret1)
*ret1 = r1;
if (ret2)
*ret2 = r2;
return r0;
}
EXPORT_SYMBOL(scm_call_atomic4_3);
【问题讨论】:
-
类似this?
-
@DavidWohlferd 该链接解释了安全模型。我更想知道在 SMC 调用后运行的代码。
-
关键是 SMC 调用进入安全世界。这可以有一个完全不同的物理内存映射,并且有不同的模型来说明安全世界中的软件如何运行。它绝对不必是(并且可能不是)Linux。这通常是闭源软件,您可能能够访问二进制图像,甚至可能很困难。您可能需要进行逆向工程或与创建安全世界软件的供应商交谈。
标签: arm kernel android-kernel trust-zone