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

时间:2016-09-21 11:03:58

标签: linux linux-kernel arm64

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

如何更改此模式?

我在ARMv8 64位上运行。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

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

我要给出一个厚脸皮的答案。

适应what is the current execution mode/exception level, etc?并入侵您感兴趣的地区:

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();

在启动开始时输出。

EL = 1

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

CPU: All CPU(s) started at EL1
  

如何更改此模式?

将数千行内核代码放入一个永远不会被合并的补丁中:-)

请记住,最常见的EL2实现是Xen和EL3 ARM Trusted Firmware,然后内核调用这些实现。进一步的解释位于:What are Ring 0 and Ring 3 in the context of operating systems?