【问题标题】:what is a simple way to implement ARM SMC什么是实现 ARM SMC 的简单方法
【发布时间】:2015-07-04 22:13:21
【问题描述】:

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

我仍在学习节魔法以及链接器如何映射程序集导出“标签”?宏? (不知道他们叫什么)到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- 感谢您的帮助和解释。阿伦 - 这绝对有帮助。

【问题讨论】:

  • 您需要更好地描述您要完成的工作。您的大部分帖子只是猜测在黑暗中随机刺伤的解决方案可能是什么。
  • 真的不清楚你在这里得到什么 - 关于引导加载程序和链接器的所有这些东西是什么?发出一个 SMC 调用,最简单的,不超过asm volatile("smc #whatever"); - 我知道内核中已经有至少 3 个实现(arch/arm/kernel 中的 PSCI 代码,以及一些 Tegra 和 Exynos 固件驱动程序),你可以画在。或者您实际上是在谈论编写安全固件来处理该调用?
  • 你还没有解释你想要完成什么。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-03-21
    • 2010-11-23
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多