kexecのpurgatory
kexecはメモリ上にカーネル一式(カーネル本体、コマンドライン引数、initrdなど)を展開する
また同時に特別な領域としてpurgatoryというものを展開する
purgatoryはカーネルに入る前の代替初期化ルーチンらしい
cold bootの場合、CPUのモードの初期化などが行われるが、kexecを使用すればそれが必要なくなり、
本来の初期化ルーチンの代わりにkexecではpurgatoryを使うわけだ
purgatoryの大体の流れを追ってみた(kexec-tools-2.0.2)
まずエントリーポイント探す。mainかと思ったけどどうやら違う。
purgatory/Makefileを見るとリンカーを実行しているところで-eオプションでエントリーポイントをpurgatory_startに指定している
#purgatory/Makefile $(PURGATORY): LDFLAGS=$($(ARCH)_PURGATORY_EXTRA_CFLAGS)\ --no-undefined -nostartfiles -nostdlib -nodefaultlibs \ -e purgatory_start -r
このpurgatory_startはアーキテクチャ依存のディレクトリに存在していて、x86_64だとarch/x86_64/setup-x86_64.Sの中にある
setup-x86_64.Sの中ではセグメントレジスタの初期化を行った後、purgatory本体に飛び、その後はカーネル本体へジャンプするためにentry_64を呼び出す。
purgatory本体はpurgatory/purgatory.cにある
//purgatory/puragatory.c void purgatory(void) { printf("I'm in purgatory\n"); setup_arch(); verify_sha256_digest(); post_verification_setup_arch(); }
setup_arch()は以下のようにreset_vgaとlegacy_picオプションが付いていた場合のみ意味がある
void setup_arch(void) { if (reset_vga) x86_reset_vga(); if (legacy_pic) x86_setup_legacy_pic(); }
その後、veryfy_sha256_digest()が実行されるが、これはロードされたカーネルなどのハッシュ値が正しいか確認をしているんだと思う
post_verification_setup_arch();についてはよくわからない
思いの外、大したコード量じゃない気がする。どこかに見落としがあるんだろうか?