2005-07-16

_GRUB 2

昨日からやってたGate A20コードの書き直しが大体完了。 どうもこういうのにqemuを使うのはよくないらしく、 VMWareの方がチェックが厳しい(しっかりしている)のは結構興味深いですね。 qemuはかなり甘くて、qemuで動いても本物のマシンでは動かんことがよくあります。 結局私は物理マシンでデバッグしまくりました。

一応これでsyslinuxと同等になったはず。 Gate A20にまつわる悪夢は A20 - a pain from the past によくまとまってますが、 他にもウェブ上を徘徊したり、 GRUB Legacyで得られた知見を基にして書いてます。 hpaのコードは使いたくないので、syslinuxのコードは一切使ってません。

Gate A20を無効にするときのチェックが厳しすぎるのが問題になる可能性が高いので、 明日もう少し弄るつもりです。

_サンがSolarisの起動プロセスを見直し--GRUBを採用

一ヶ月も前の記事ですが、 GRUB自体が記事になっているのは知りませんでした。

またGRUBを採用したことにより、Solarisはコンピュータ業界の主流に近づくだろうと、Fowlerは予測している。「(Solarisは)広く受け入れられるものになるだろう」(Fowler)

まあ、なんかかなり意味不明の発言ですが、迷惑ではないので別にいいや。

GRUB 2のUltraSparcへの移植作業も迅速に進んでいるので、 遠からずSolarisは完全にGRUBベースになっちゃうかもしれませんね。 でもその作業の中にSunの人は誰もいないってところがまたあれですな。 パッチ送るって言ったまま、またどっか消えちゃってるし。

_ブートローダの作り方

たまにどうやってGRUBを開発しているのか質問されることがあるので、 簡単に書いておきます。

基本的に泥臭いです。 カーネルの開発と大差ありません。 当然ユーザレベルのプログラムより遥かに大きな労力と時間が必要です。

魔法のようなものは何にもありません。 ひたすら泥臭く頑張るだけです。 もちろん効率化の努力はしてますが。

時代の変遷とともに変化してますね。 私がやり始めた頃は、マシン二台で、フロッピー使ってました。 20枚だか30枚だかの、フロッピーの塊を購入してきて、 どうもおかしいと感じたら、次々別のフロッピーに切替えます。 一台は完全に開発用、もう一台がテスト用。 開発マシンでフロッピーにインストールして、 テストマシンにがちゃっと挿し込んで、リセットボタンを押すだけ。

grub shellを作ってからは、かなり楽になりました。 所詮エミュレータなので同じではありませんが、 高レベルの機能は普通のアプリケーションみたいにデバッグできます。 gdbも使えますし。 GRUB 2ではgrub-emuってやつですな。

それでもネイティブのテストは欠かせません。 多分最初に取り組んだのがシリアルのサポートで、 これが出来てからはディスプレイを切替える必要がなくなりました。 さらにネットブートもサポートしてからはフロッピーの必要性がほぼ消失しました。 めちゃくちゃ効率的になりましたね。

もちろん、本当の最初の部分ばかりはそうもいかないので、 本当に大変な部分はとにかく弄らない。 下手に触らないに越したことはありません。 だから、ブートセクタを改良するパッチを投げられても、 ほぼ100%却下してきてますね。 よっぽど深刻な事情がない限り、 デバッグのコストを考えると、やる価値がないのです。 こういう部分は相当BIOS依存で問題が起きるので、 テストしてもらうにも一苦労です。 全部自分でもテストできることはまだいいですが、 リリースしないと問題が分からないようなことはあんまりしたくありません。

その後はbochsが登場(というか、MandrakeによるLGPL化)して、 ますます簡単に。 最近はqemu使ってますけど、 これはLive CDとか、もっと巨大なものをテストする機会が増えたからで、 bochsにはbochsの良さがありますね。 ソースコードの弄りやすさでbochsに軍配が上がります。

GRUB 2はまだシリアルをサポートしてないので、 実マシンでテストするのにディスプレイが必要です。 ブート自体はPXEで。 最近シリアルのないマシンが増えてきましたし、 ケーブルを引き回すのが面倒なので、 ネットコンソールを実装する方が良いかなあと考えています。 そのためにはまずデバイスドライバを仕上げないといけませんが。

以上がテストのやり方。

デバッグそのものは多分昔LinusがLinuxの開発方法について語っていたのと大差ないと思います。 役に立つのは、デバッグ・プリント、キー入力待ちやhlt等による停止、 そして、何より勘と目。 hltで止めるのはどこまでちゃんと行ってるか見るのに都合が良くて、 デバッグ・プリントを併用して、 情報を入手します。 大体見当が付いたら、 とにかくよく見て考える。 そしてどんどんテストしてみる。 テスト用にコード書くのを躊躇わないことです。 そしてテスト用のコードにまたバグがあったりして涙が出そうになるわけですが。

しかし勘はねえ、解説できないんですよね。 やってると何となく分かるんですよね。 ああ、あれだなあと。 分かり易いのはCtrl-Alt-Delでリブートできるかどうかですね。 割り込み禁止状態やスタックがぶっ潰れると効きませんから、 多少は目安になります。 それ以外にもいろいろあるんですけどねえ、 言葉で表現しにくいものが多いですねえ。

[]