Что такое простой способ реализации ARM SMC
Я пытаюсь написать программу, которая выполняет один вызов 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- Спасибо за вашу помощь и объяснения. Арун - это определенно помогает.
1 ответ
Я считаю, что есть недопонимание относительно реализации зоны доверия ARM.
Вся среда исполнения делится на безопасные и незащищенные миры. Linux находится в небезопасном мире. Обычно (безопасный) сертифицированный кусок кода работает в безопасном мире. Этот защищенный образ обычно выпускается поставщиком SoC и не может быть подделан.
Защищенный код загружается в защищенную память перед загрузкой Linux. С этого момента SMC-вызов действует как мост, который переносит режим выполнения в безопасный мир. Вызов SMC переводит режим выполнения в режим Secure Monitor (который реализован в безопасном коде), который имеет более высокий уровень привилегий и находится вне сферы действия ядра Linux.
Поскольку вы не можете вмешиваться в реализацию зоны доверия поставщика SoC, вы не можете добавлять к ней новые API. Если вам нужно вызвать существующий безопасный API, вам нужно знать соглашения о вызовах и определение API. Если поставщик SoC предоставит эту информацию, вы сможете вызвать существующий безопасный API.