64bit OS(x64 Kernel)の自作のために(1)

前から気になっていたところ、以下Blogで実際に動くコード(x86->x64)が公開されていたので、BlogとOSDEVの記事を参考にしながら動かしてみた。

ビルド環境はWindows7 with Cygwin(x86_64-pc-linux-gnu-gcc ver 4.8.2)

このとき、はまったのがx64でのGDT(Global Descriptor Table)の設定。
IDT(Interrupt descriptor table)と同じくbaseのアドレス設定値が64bitアドレスに拡張されているという別の記事を信じてしまったところ、うまくいかず四苦八苦。真相はx64でGDTのbase/limitは拡張されていないが正しい。

以下、処理の流れ。

  1. GRUB2で32bit Kernel(multiboot形式)をロードする。(以下32bitコード)
  2. 32bit/64bit用のGDTを作成する。
  3. 32bit用のGDTを読みこむ & セグメントを設定する。
  4. Pagingの有効化()
  5. PAEの有効化(CR4を設定する)
  6. Long Mode(64bitコードに移行 このとき64bitのセグメントを読み込ませる)のコードにJMPする。
  7. C言語のKernelを呼び出す。

参照:
Linuxをはじめよう!:1から創る自作OS x86_64 01h
Creating a 64-bit kernel - OSDev Wiki