コケッココケッコ

コケコッコー

リアルモードからプロテクトモードへの移行

概要

ブートローダーでCPUをリアルモードからプロテクトモードに切り替える。

CPUは、CR0レジスタの最下位ビットが0であればリアルモードで動き、1であればプロテクトモードで動く。

ただし、プロテクトモードへ移行するためには、プロテクトモードが必要とするテーブルやレジスタを設定しておく必要がある。

手順

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等を設定

参考文献