letsspeak's diary

世界を大いに盛り上げるためのletsspeakの日記。

ブートローダーとカーネルローダー

ポトリスというゲームで「継続ハ力ナリ」という名前のプレイヤーがいて、仲間内では「継続はかなり」さんと呼んでいました。いつも丸太をやっていた消防士(当時50)のごんべえさん、元気でしょうか?ワシャシャシャシャシャ!

ぐだぐだOSプロジェクト

さて、VirtualBoxでOS動いたら楽しいじゃん?から始まったプロジェクトを始めて半月くらいが経ちました。

letsspeak/myos · GitHub

金曜日は色々とアルコール摂取が必要なので仕方ないとしても、なんとか生活習慣として根付かせようと頑張った結果、今日やっとカーネルに突入しました。

f:id:letsspeak:20151021233049p:plain

この画像にあるBheckkingのBの部分がカーネルが動いている証拠で、今のカーネルの仕事はそこで終了です。

生活習慣の中にきちんと趣味を組み込むとやっぱり人に話したくなるもので、カーネルローダーの話とかみなさんまったく興味はないと思いますし、聞き流すのが普通だとおもいますが、それなりに濃い話をできるというのはとても楽しいものだなと実感しています。

ふつうのプログラムの開発でにっちもさっちも行かず前に進めない状態というのは中々ないのですが、今回は本当に日進月歩でした。
つまらないメモですがこれまでのなんとなくの履歴を残しておきます。

ブートローダ

まずブートローダー。VirtualBoxでOSを起動しようとすると、まずBIOSが動きます。
BIOSフロッピーディスクドライブのブートセクタ512バイトを自動的に読み込んで中に書いてあるプログラムを実行してくます。

512バイトというと、アセンブラの命令で結構たくさんのプログラムが組み込めるように見えますが、なにせ初心者なのでできるだけ画面に文字を表示させて安心したいものです。

たとえば、現在の状況がわかるように"Loading Kernel Loader..."という22文字を表示させる場合、文字列を512バイトの中に組み込むので残りは490バイトという感じで減っていきます。手順が5段階で各手順の状況を出力すると512バイトのおよそ2割が文字列の情報だけで埋まってしまうのです。

また、単に文字列を表示させるだけでは正直中の状態がよくわからない!ということでAXレジスターの値を16進数で表示させるプログラムを組んで状態を見ながら開発を進めていましたが、後半になるにつれてどんどん残りのサイズが減っていきました。
最後は本当は必要な処理を一旦コメントアウトして、デバッグ用の16進数表示のプログラムを中に入れたりしながら、ブートローダーが完成しました。

現代ではこんな経験はたぶんここでしか有りえないと思いますし、作ったところで特に意味はないですが、1週間くらいでできる中々に楽しい経験なので、プログラマーには割とおすすめです。

カーネルローダー

ブートローダーの16bitの状態ではセグメントレジスタ(指定値を16倍にしてくれる)を利用しても0xFFFF0+0xFFFF=0x10FFEFつまり111kB分のメモリアドレスまでしかアクセスできないので、カーネルローダーの中で32bitに移行してカーネルイメージの読み込みを行います。

これまで利用していたBIOSの機能は16bit用のプログラムなので、32bitに移行してしまうとこれらが一気に使えなくなります。これがかなりの鬼門でしたが、実はVRAMの領域に直接アクセスして値を書き換えてあげると画面に文字を表示することができるので、それを利用して32bit用の独自の画面表示の仕組み(文字送りなど)を512バイトの制限に囚われることなく書くことができます。

A20やGDTの指定、意図しないEDXレジスタへの副作用(おそらく)など、鬼門となる箇所が非常に多く「なぜ動かないのかが分からない」という事態に何度もぶち当たりましたが、毎日継続しながら小さな可能性をひとつひとつ潰していくことでひとまずは何とかなりました。

カーネル

よーしカーネルローダーが終わった!あとはカーネルを動かすだけだ!
と思ってから1週間ほどカーネルローダーを直し、カーネル側のコンパイルにも数日かかりました。

自作のプログラムを動かす都合上バイナリの先頭からプログラムが始まっていなければならず、リンカスクリプトをうまく読み込ませてコンパイルさせることが必要になります。このあたりgccなど慣れている人なら簡単に終わるのかもしれません。

まとめ

以上、そんな感じでひとまずC言語に到達できました。
今後はC言語で基本的な仕組みを整えつつ、ネットワークまわりから1MB以上のデータを貰ってくる必要がありそうです。

プログラマーとしてアセンブラとかいう非生産的な言語には一種の憧れがありましたが、実際に使ってみると何の役にもたたないただのクソ言語だったと感じます。
おそらくアセンブラ機械語を書いていた大昔のプログラマーも「こんなん絶対別の記述したほうがいいだろ」とか頭の中に現代を描きながら悶々とプログラムを書いていたに違いないと思います。

なんだかよく分からない纏めになりましたが、
継続すればなんとかなるというところは大事にしたいなと思います。

P.S. valley of the cityで韓日ギルドのダブルを盗んだ時の快感を今でも思い出します。