저는 안드로이드의 커널을 읽고 CPU 코어 (일명 DVFS, DCVS)의 동적 전력 관리가 어떻게 진행되고 있는지 보았습니다. 내가 찾은 코드 here은 다음 함수 (정의 된 here)를 호출하고 SMC 어셈블리 명령어를 호출합니다.ARM의 SMC 호출 해석 방법은 무엇입니까?
ARM에는 SMC calling convention을 설명하는 문서가 있지만 다음 기능을 이해하는 데 사용할 수 없었습니다. 어떻게하면 SMC 명령을 추적하여 입력 피연산자에 따라 실제로 수행되는지 확인할 수 있습니까? 그 여러 업체들이 세계와 하나의 코드를 작성할 수 있도록 SMC calling conventions
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] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/Chdfjdgi.html)과 같은 것입니까? –
@DavidWohlferd 링크가 보안 모델을 설명합니다. SMC 호출이 실행 된 후에 실행되는 코드를 알고 싶습니다. – Mahdi
포인트는 SMC 통화가 안전한 세상으로 간다는 것입니다. 여기에는 전혀 다른 ** 실제 ** 메모리 맵이있을 수 있으며 보안 세계에서 소프트웨어가 실행되는 방식에 대한 여러 모델이 있습니다. 분명히 리눅스 일 필요는 없습니다. 이것은 일반적으로 사용자가 이진 이미지에 액세스 할 수 있거나 심지어 어려울 수도있는 폐쇄 소스 소프트웨어입니다. 보안 세계 소프트웨어를 만든 공급 업체와 리버스 엔지니어링 또는 대화를해야 할 수도 있습니다. –