如何知道linux内核运行的是EL2(非安全)还是EL3(安全)模式?

yvo*_*ngr 3 linux linux-kernel arm64

在哪里可以检查 Linux 内核是否在非安全 (EL2) 或安全 (EL3) 模式下运行?

我怎样才能改变这个模式?

我在 ARMv8 64 位上运行。

提前致谢

Cir*_*lli 5

在哪里可以检查 Linux 内核是否在非安全 (EL2) 或安全 (EL3) 模式下运行?

我要厚颜无耻地回答一下。

适应当前的执行模式/异常级别等是什么?并破解您感兴趣的区域:

diff --git a/init/main.c b/init/main.c
index 18f8f0140fa0..840f886d17b3 100644
--- a/init/main.c
+++ b/init/main.c
@@ -533,6 +533,10 @@ asmlinkage __visible void __init start_kernel(void)
    char *command_line;
    char *after_dashes;

+   register u64 x0 __asm__ ("x0");
+   __asm__ ("mrs x0, CurrentEL;" : : : "%x0");
+   pr_info("EL = %llu\n", (unsigned long long)(x0 >> 2));
+
    set_task_stack_end_magic(&init_task);
    smp_setup_processor_id();
    debug_objects_early_init();
Run Code Online (Sandbox Code Playgroud)

启动时输出。

EL = 1
Run Code Online (Sandbox Code Playgroud)

默认的 Linux 内核 v4.19 启动日志还告诉我们,默认情况下:

CPU: All CPU(s) started at EL1
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这个模式?

传统上,内核仅在 EL1 上运行,EL2 留给 Xen 等虚拟机管理程序,EL3 留给 ARM Trusted Firmware 等引导加载程序。

然而,随着ARMv8.1 VHE扩展的引入,EL2内核变得高效并被添加到Linux主线中:操作系统上下文中的Ring 0和Ring 3是什么?不确定哪个配置会打开它,看看吧。

EL3我不认为有什么主线。还有一些人试图将内核代码改编为 booloader,请查看: https: //github.com/kexecboot/kexecboot