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

时间:2015-07-04 22:13:21

标签: assembly linux-kernel arm linux-device-driver trust-zone

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

我还在学习章节魔法以及链接器如何映射程序集导出标记'?宏? (不确定它们被称为什么)到C程序。请告诉我是否真的需要阅读GNU链接器文档以了解它是如何发生的。

@Ross Ridge-谢谢。 SMC,安全监视器调用,是与ARM Trust Zone服务接口的指令。我的问题是如何实现这个调用。这里的大多数帖子和答案都暗示了Linux内核树上还没有这样的接口。所以,我知道我必须在汇编中写它。 @Notlikethat - 嘿,伙计。我正在使用不同的平台。高级实现我的平台的其他实现是什么,即高通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-感谢您的帮助和解释。阿伦 - 这绝对有帮助。

1 个答案:

答案 0 :(得分:3)

我认为对ARM信任区实施存在误解。

整个执行环境分为安全和非安全世界。 Linux驻留在非安全的世界中。通常,(安全)认证的代码片段在安全的世界中运行。此安全映像通常由SoC供应商发布,不能被篡改。

在Linux启动之前加载安全代码以保护内存。从那时起,SMC调用充当将执行模式带到安全世界的桥梁。调用SMC将执行模式转换为安全监视器模式(在安全代码中实现),这是一种更高的权限级别,并且在Linux内核的范围之外。

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