exited normally

--back of the flyer--

『作って分かる!x86_64機械語入門』を読んだ

ゼロから機械語に入門するために『作って分かる!x86_64機械語入門』を読んだ。

本書はQEMUを使って手を動かしながら学ぶスタイルを採っているので、「動いた!」という感触自体がモチベーションに繋がる読者にぴったりだ。

基本的な機械語命令を使って、シリアルドライバやフレームバッファを使った画面描画処理、キーボードドライバを書く内容となっている。

画像は3章でシリアルドライバを作る手始めに、⽂字'A'をシリアル通信で送って動作確認をしているところ。

この節ではシリアル通信のコントローラの状態を確認をせずに書き込みを⾏っているのだが、このままでは未送信のデータを上書きして消してしまう恐れがあるので、次の節でコントローラの「送信バッファが空になった」事を⽰すフラグを確認してから書き込むように変更する。

このように、小さく始めて段階的に作っていくので理解しやすい。

章末まで読み進めてシリアルポートから受信したデータをエコーバックする処理を実装するとそれっぽくなった!

$ od -t x1 fs/kernel.bin 
0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000020 66 ba fd 03 ec 24 01 75 04 f3 90 eb f3 66 ba f8
0000040 03 ec 88 c3 66 ba fd 03 ec 24 20 75 04 f3 90 eb
0000060 f3 88 d8 66 ba f8 03 ee 3c 0d 75 d4 b3 0a eb e4
0000100

筆者は「完全に私の趣味であり一発ネタのような本」と言っているが、入門に使えそうな本やWebコンテンツを読んでみるとアセンブリ言語を使った説明が主のものが多く満足できずにいたところを本書に助けられた。

補足

楽しく手を動かしながら読了したが、私の環境では再現できない内容があった。

4章で、045_color_noise/sample.txtをアセンブルしてkernl.binを生成しQEMUを実行すると、「ランダム⾊の描画により、ノイズ画像のようなものが表⽰」されると説明があるが、画面は変化せず黒いままだった。

また、この時にシリアル通信用の画面に切り替えると「!!!! X64 Exception Type - 06(#UD - Invalid Opcode) CPU Apic ID - 00000000 !!!!」ではじまる次のメッセージが表示されていた(画像)。

解決したので、後日追記予定。解決方法を追記する予定だったが、この件について著者の大神さんとコンタクトを取ることができ、丁寧に解説いただいた上で公式ページの「追加・訂正情報」に私が報告した内容を反映してもらえたので、もし同様の現象が発生してその解決のためにこの記事にたどり着いた人は公式ページをご覧ください。