2

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

我仍在学习部分魔术以及链接器如何映射程序集导出“标签”?宏?(不知道他们叫什么)到C程序。请告诉我是否真的需要通读 GNU 链接器文档以了解这是如何发生的。

@罗斯里奇-谢谢。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-感谢您的帮助和解释。阿伦 - 这绝对有帮助。

4

1 回答 1

4

我相信对 ARM trustzone 实现存在误解。

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

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

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

于 2015-07-05T18:21:33.710 回答