什么是实现 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.
我正在尝试编写一个发出一个 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.