x86 ブートローダー
x86は16bitでどうさするrealモードで起動する
上位のモードに移るには、16bit -> 32bit -> 64bit (amd64) の順でモードを変更する
BIOSはディスクの先頭のセクタ(512バイト)の末尾の2バイトが 0x55AA であるかチェックして起動ディスクであるか確認する
起動ディスクならBIOSは物理アドレスの0x7C00にセクタのデータを配置して実行する
32bitで動作させるにはrealモードからprotectedモードに移行が必要
A20ポートを有効にする
0x60, 0x64に書き込む
GDTを設定
GDTはGlobal Descriptor Tableの略
名前の通りディスクリプタを格納しておくテーブル
ディスクリプタで、セグメントの開始位置、サイズ、アクセス権限を指定する
32bitモードではセグメントレジスタにGDTのディスクリプタへのオフセットを指定する
コントロールレジスタであるCR0を操作して、protectedモードにする
ljmp(Long Jump)でCSレジスタを設定する
プロテクトモードを有効にしても、プロセッサがすぐに論理アドレスから物理アドレスへの変換を行う訳ではない
ある新しい値がセグメントレジスタにロードされ、プロセッサがGDTを読み込むと、内部のセグメンテーションの設定が変更される