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