uchan note

プログラミングや電子工作の話題を書きます

レガシー BIOS が 2020 年で消えたあとの世界

11 月に入って,Intel が 2020 年までにレガシー BIOS サポートを完全に消そうとしているというニュースが飛び込んできました.

www.itmedia.co.jp

OS を自作する場合はいまだに BIOS に頼った起動コードを書くことが多いと思います. このニュースが意味する正確なところを少し解説した後,レガシー BIOS がなくなった後の世界を自作 OS の視点から考えてみます.

自作 OS Advent Calendar 2017 5 日目の記事です.

レガシー BIOS とは

そもそもレガシー BIOS というのは「30 日でできる!OS 自作入門」で最初の方に触れる,パソコンのファームウェアです. 「30 日でできる!OS 自作入門」の中では,画面にメッセージを表示したり,フロッピーディスクからデータを読み込んだりするのに使いますね.

レガシーと言われるのは,それが登場した時期が古く,互換性のために過去のしがらみをずっと引きずっているからです. BIOSとUEFIの歴史 - syuu1228's blog にはこうあります.

BIOSIBM PC(1981年)と共に登場し、「IBM PC互換機」が普及した事によりパソコンの標準ファームウェアとなりました。

UEFI とは

UEFI とはレガシー BIOS に代わる新しいファームウェアの規格です. 新しいといっても,元となる EFI という規格の登場から 20 年以上経っており,現行の PC はほとんどが UEFI にとって代わっています.

UEFI にはクラス 0 から 3 までがあり,次のようになっています.

UEFI Class 0 - 2 が搭載されているコンピュータであれば,「はりぼて OS」がそのまま動くでしょう.

この,UEFI なのにレガシー BIOS のインターフェースが使える状態を実現しているのが,UEFI の CSM(Compatibility Support Module)と呼ばれる互換性機能です. 11 月のニュースは,Intel 製の UEFI 実装から CSM を 2020 年までに削除するというニュースなのです.

レガシー BIOS 無き世界

わざわざ「レガシー」BIOS と書いているのは,UEFI は正確には UEFI BIOS と呼ぶからです.単に BIOS というと,レガシーを指すのか,UEFI を指すのかに曖昧性があります.

閑話休題

レガシー BIOS がなくなると自作 OS の世界はどのように変わるでしょうか. 「はりぼて OS」の何が動かなくなるのでしょうか?少し考察してみます.

ブートローダ

まず,レガシー BIOS 時代は「起動メディアの先頭 512 バイトがメモリの 0x7c00 にコピーされ,そこにジャンプする」というルールがありました. 皆さん一度は 0x7c00 に配置される前提の起動コードを書いたことがあるのではないでしょうか.

UEFI ではもはやその方法では起動できなくなりました. UEFI では main 関数(名前は違いますが)から起動される C 言語プログラムとして起動コードを書くことになっています.

起動シーケンス

レガシー BIOSUEFI では起動シーケンスが大きく異なります.

レガシー BIOS では,起動メディアの先頭 512 バイトが起動されたときの CPU の動作モードは実アドレスモード(リアルモード)です. ブートローダーは A20 ゲートの初期化などを行った後で保護モードに移行し,必要であればページングなどを初期化して IA32e モード(64 ビットモード)などに移行します. したがって,保護モードまでで起動処理を止めておくことで,ページングのことを知らなくても OS プログラミングが可能です.

UEFI では,ブートローダーは UEFI アプリケーションとして作成し,最終的に単一の PE バイナリ(実行可能ファイル)となります. 起動メディアに配置された PE バイナリが読み取られて実行されるときの CPU 動作モードは 32 ビット UEFI では保護モード,64 ビット UEFI では IA32e モードとなります.

CPU の動作モードを自力で切り替える必要がない反面,自由な動作モードで自分の OS を動かすことができません. IA32e モードではページングが必須なので,「30 日でできる!OS 自作入門」には書かれていないページングについて知る必要が出てきます.

ディスク読み込み

ブートローダ―の中で起動ディスクからセクタを読み込んでメモリにコピーし,カーネルにジャンプする,というのがブートローダーの主な役目です. 「はりぼて OS」では int 0x13 割り込み命令を使って読み込み指示を出しています.

この読み込み命令ももちろん,レガシー BIOS が消えるのに伴ってなくなります. UEFI の流儀に従ってディスク読み込みを行う必要があります.

なお,UEFI ではレガシー BIOS よりも起動ディスクの選択の幅が広がります. USB メモリから起動させるとか,ネットワーク経由でカーネルイメージをダウンロードして起動するなんてことが簡単にできます. レガシー BIOS から非常に進化しています.

キーボード

最近のキーボードは PS/2 のものは見なくなり,ほぼ完全に USB 接続のものに置きかわりました.(ノートパソコン内蔵のキーボードには PS/2,SPI,I2C 接続のものがあるようです。)

「はりぼて OS」はキーボードコントローラという制御チップを介してキーボードを制御しています. キーボードコントローラは PS/2 時代のもので,USB 本来の制御方式ではありません. しかし,レガシー BIOS や CSM がある UEFI では,エミュレーションにより PS/2 と同じやり方で USB キーボードを使うことができる機種があります.

CSM のない UEFI ではもはやキーボードコントローラを使うことができないようです1. そのような機種で USB キーボードを使うにはUSB ドライバを実装する必要があります. USB ドライバの構築はかなり大変な作業で,もし「30 日でできる!OS 自作入門」に追加するとしたら,さらに 30 日分くらいの章が増えるのではないかと思います.

キーボードが使えないということは,もちろんマウスも使えないということを意味します.

さいごに

OS 自作が好きな人,低レイヤの人のためのコミュニティ osdev-jp は,2 カ月に 1 回程度「自作 OS もくもく会」を企画しています. osdev-jp の Slack に参加いただければ,イベント開催のお知らせを手に入れることができます. 興味のある方はぜひご参加ください.


  1. MinnowBoard Turbot で検証