我正在尝试编写一个发出一个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-感谢您的帮助和解释。阿伦 - 这绝对有帮助。
答案 0 :(得分:3)
我认为对ARM信任区实施存在误解。
整个执行环境分为安全和非安全世界。 Linux驻留在非安全的世界中。通常,(安全)认证的代码片段在安全的世界中运行。此安全映像通常由SoC供应商发布,不能被篡改。
在Linux启动之前加载安全代码以保护内存。从那时起,SMC调用充当将执行模式带到安全世界的桥梁。调用SMC将执行模式转换为安全监视器模式(在安全代码中实现),这是一种更高的权限级别,并且在Linux内核的范围之外。
由于您无法篡改SoC供应商的Trustzone实施,因此无法向其添加任何新API。如果需要调用现有的安全API,则需要了解所遵循的调用约定和API定义。如果SoC供应商提供这些信息,您将能够调用现有的安全API。