什么是实现 ARM SMC 的简单方法

what is a simple way to implement ARM SMC

我正在尝试编写一个发出一个 SMC 调用的程序。查了前面的问题,我的理解是Linux内核里面没有真正的API来实现ARM SMC?我正在开发基于 msm8974 的原型,想知道最好的方法是什么。

我仍在学习段魔法以及链接器如何映射程序集导出 'tag'?宏? (不确定它们叫什么)到 C 程序。请告诉我是否真的需要通读 GNU 链接器文档以了解这是如何发生的。

@Ross Ridge- 谢谢。 SMC,Secure Monitor Call,是与 ARM Trust Zone 服务接口的指令。我的问题是如何实现这个调用。这里的大多数帖子和答案都暗示这样的接口在 Linux 内核树上还不可用。所以,我知道我必须在汇编中编写它。 @Notlikethat - 嘿伙计。我正在使用不同的平台。为我的平台(即 Qualcomm Snapdragon)实施这些其他实施在高层次上涉及什么?

@Notlikethat - 这是我在 /arch/arm/kerel 下看到的:

sansari@ubuntu:~/WORKING_DIRECTORY/arch/arm/kernel$ ls
arch_timer.c    entry-common.S   kprobes-arm.c           perf_event_v6.c      suspend.c
armksyms.c      entry-header.S   kprobes.c               perf_event_v7.c      swp_emulate.c
arthur.c        etm.c            kprobes-common.c        perf_event_xscale.c  sys_arm.c
asm-offsets.c   fiqasm.S         kprobes.h               pj4-cp0.c            sys_oabi-compat.c
atags.c         fiq.c            kprobes-test-arm.c      pmu.c                tcm.c
atags.h         ftrace.c         kprobes-test.c          process.c            tcm.h
bios32.c        head-common.S    kprobes-test.h          ptrace.c             thumbee.c
calls.S         head-nommu.S     kprobes-test-thumb.c    relocate_kernel.S    time.c
compat.c        head.S           kprobes-thumb.c         return_address.c     topology.c
compat.h        hw_breakpoint.c  leds.c                  sched_clock.c        traps.c
cpuidle.c       init_task.c      machine_kexec.c         setup.c              unwind.c
crash_dump.c    insn.c           Makefile                signal.c             update_vsyscall_arm.c
debug.S         insn.h           module.c                signal.h             update_vsyscall_arm.h
devtree.c       io.c             opcodes.c               sleep.S              user_accessible_timer.c
dma.c           irq.c            patch.c                 smp.c                vmlinux.lds.S
dma-isa.c       isa.c            patch.h                 smp_scu.c            xscale-cp0.c
early_printk.c  iwmmxt.S         perf_event.c            smp_tlb.c
elf.c           jump_label.c     perf_event_msm.c        smp_twd.c
entry-armv.S    kgdb.c           perf_event_msm_krait.c  stacktrace.c

我可能需要更新内核?

@Notlikethat - 请指点我关于您提到的 EXINOS 和...的实现的文档?

@all- 感谢您的帮助和解释。阿伦 - 这绝对有帮助。

我认为对 ARM trustzone 实现存在误解。

整个执行环境分为安全世界和非安全世界。 Linux 居住在不安全的世界。通常,经过(安全)认证的一段代码在安全世界中运行。此安全映像通常由 SoC 供应商发布,无法篡改。

安全代码在 linux 启动前加载到安全内存。从那时起,SMC 调用充当将执行模式带到安全世界的桥梁。调用 SMC 会将执行模式设为安全监控模式(在安全代码中实现),这是一个更高的特权级别,并且在 linux 内核的权限之外。

由于您无法篡改 SoC 供应商的信任区实施,因此您无法向其添加任何新的 API。如果您需要调用现有的安全 API,您需要了解遵循的调用约定和 API 定义。如果 SoC 供应商提供这些信息,您将能够调用现有的安全 API.