Linux Boot Sequence を読む ( 6 ) ~ startup_64 ~

February 19, 2018

startup_64

圧縮カーネルの解凍ルーチンの後は、Linux カーンルのエントリポイントである startup_64 に制御が移される。ソースコードは arch/x86/kernel/head_64.S 。
startup_64 は今までのブートシーケンスにて作り上げられたプロテクトモードをもうちょっとだけ整えて、x86_64_start_kernel() を呼び出すまでの処理を担当する。
具体的にはページテーブルを再設定したり、CPU の機能を設定したりなどのルーチンが実行される。CPU の機能というのは syscall 命令や NX 機能の有効化などであり、例えば syscall や NX は以下で拡張機能イネーブルレジスタ (Extended Feature Enable Register, EFER) の各 bit フラグを立てることで有効化されている。

        /* Setup EFER (Extended Feature Enable Register) */  
        movl    $MSR_EFER, %ecx  
        rdmsr  
        btsl    $_EFER_SCE, %eax        /* Enable System Call */  
        btl     $20,%edi                /* No Execute supported? */  
        jnc     1f  
        btsl    $_EFER_NX, %eax  
        btsq    $_PAGE_BIT_NX,early_pmd_flags(%rip)  
1:      wrmsr                           /* Make changes effective */  

EFER の詳細については以下をご参考ください。
CPU Registers x86-64 #IA32_EFER

で、最後に x86_64_start_kernel() が呼ばれる。

        GLOBAL(initial_code)  
        .quad   x86_64_start_kernel  

 © 2023, Dealing with Ambiguity