概要
ブートローダーでCPUをリアルモードからプロテクトモードに切り替える。
CPUは、CR0レジスタの最下位ビットが0であればリアルモードで動き、1であればプロテクトモードで動く。
ただし、プロテクトモードへ移行するためには、プロテクトモードが必要とするテーブルやレジスタを設定しておく必要がある。
手順
- GDTの作成
- GDTレジスタの設定
- IDTの作成
- IDTレジスタの設定
- A20のマスク解除
- CPUへの割り込み禁止
- CR0レジスタの最下位ビットを1にする
- パイプラインの内容をフラッシュ (JMP命令を発行すればいい)
- セグメントレジスタの設定
GDTの作成
セグメントをどのように切るかに依存する。
64bitモードのセグメントは、セグメントのベースとリミットの値は無視され、必ずフラットモデルで扱われるようなので、フラットモデルを採用したほうが無難だと思われる。
0から作るOS開発 カーネルローダその2 プロテクティッドモードとGDT
GDTレジスタの設定
GDTRの設定は下記を参照:
0から作るOS開発 カーネルローダその2 プロテクティッドモードとGDT
IDTの作成
IDTの作成は、protect mode移行後でもできる?
IDTレジスタの設定
IDTの作成は、protect mode移行後でもできる?
A20のマスク解除
マスク解除はいくらかの方法があるらしい。
- キーボードコントローラから制御する(キーボードコントローラのポートに空きがあったからという理由らしい。なんでキーボードやねん)
- System Control Portから制御
- BIOSの割り込みを使う
参考:gate A20
CPUへの割り込み禁止
CLIを使えばいい
CR0レジスタの最下位ビットを1にする
MOV EAX, CR0 OR EAX, 0x01 MOV CR0, EAX
パイプラインの内容をフラッシュ
JMP命令を使うと、命令パイプラインがフラッシュされるらしい。
セグメントレジスタの設定
SS,CS,DS,ES,GS等を設定
参考文献

新装改訂版 Linuxのブートプロセスをみる (アスキー書籍)
- 作者: 白崎博生
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/10/02
- メディア: Kindle版
- この商品を含むブログ (2件) を見る