今年のGWは、OS開発入門の定番書籍である『30日でできる! OS自作入門』を10日間で感想するチャレンジに挑戦中です。
2日目となる今日は、早くも10日目まで進むことができたので、そこまでにハマったポイントについてまとめておきます。
2日間の総作業時間は18時間程でした!
結構頑張りました笑
体感的には、1章につき1~2時間程度かかった感じです。
僕の環境が、筆者の自作ツールではなくUbuntu/NASM環境なこともあり、序盤は書籍通りにいかない部分の対応に時間がかかったような気がします。
もくじ
- 30日OSをUbuntu18.04/NASM環境で動かす際の対応
- 『NASK』の代わりに、汎用アセンブラ『NASM』を使用する
- 著者の自作コンパイラではなく、普通のgccを使用するためのリンカスクリプトを用意する
- イメージ作成のために、mformatとmcopyを使用する
- フォント作成のために、著者の自作ツールではなく、Cスクリプトを利用する
- 参照できないsprintfの代わりに、自作の代用ライブラリを使用する
- まとめ
30日OSをUbuntu18.04/NASM環境で動かす際の対応
まずは、30日OSの内容をUbuntu環境で実行する際のポイントについてまとめておきます。
というのも、『30日でできる! OS自作入門』の内容は、著者作成の独自ツールを大量に使用する構成になっており、それらのツールの大半がUbuntu環境では使用できないのです。
なら普通に書籍推奨の環境でやれよ、という話なのですが、勉強の意味も含めて独自ツールは使用せずに進めております。
10日目完了の時点までで、以下の部分の対応が必要になりました。
・『NASK』の代わりに、汎用アセンブラ『NASM』を使用する
・著者の自作コンパイラではなく、普通のgccを使用するためのリンカスクリプトを用意する
・イメージ作成のために、mformatとmcopyを使用する
・フォント作成のために、著者の自作ツールではなく、Cスクリプトを利用する
・参照できないsprintfの代わりに、自作の代用ライブラリを使用する
こうして並べてみると意外と少ないですね。
基本的には上記以外は書籍の内容を参照しながら進めていくことができます。
なので今回は、上記の記事のポイントについてまとめていこうと思います。
そんなまだるっこしいことしてられない!著者の自作ツールでもいいからとにかくLinuxで開発がしたい!
という方は、『30日でできる! OS自作入門』のサポートページにて、Linux版開発セットというコンパイル済みツールセットがダウンロードできますのでご参照ください。
著者の自作アセンブラ『NASK』の代わりに、汎用アセンブラ『NASM』を使用する
NASKではなくNASMを使用する方法は、tools/naskに丁寧にまとめられております。
とはいえ、書籍に書かれているNASKのアセンブラのほとんどは、そのままNASMでもアセンブルできました。
これらの差異はありがたいことにほとんど無いようです。
著者の自作コンパイラではなく、普通のgccを使用するためのリンカスクリプトを用意する
さて、次はリンカスクリプトについてです。
『30日でできる! OS自作入門』では、独自のコンパイラが使用されており、普通のCコンパイラを使用すると手順通りに進められません。
これは、バイナリの実行形式に違いがあるためです。
上記の問題は、リンカスクリプトを作成し、それをコンパイル時に使用することで解消されます。
詳しくは、『30日でできる!OS自作入門』のメモが参考になりました。
上記のリンク先には『30日でできる!OS自作入門』で使用できるリンカスクリプトのソースも貼られており、非常に助かりました。
イメージ作成のために、mformatとmcopyを使用する
作成したバイナリファイルをイメージ化する際には、書籍で使用されている独自ツールではなく、mformatとmcopyコマンドを使用しました。
Makefileは以下のようになります。
my-os.img : ipl.bin my-os.sys Makefile mformat -f 1440 -C -B ipl.bin -i my-os.img :: mcopy my-os.sys -i my-os.img ::
ちなみにこの“mformat”と”mcopy”コマンドですが、インストール方法が中々見つからずに苦労しました。
結論としては、上記のコマンドは、『mtools』というパッケージに含まれるため、”sudo apt install mtools”でインストールができました。
フォント作成のために、著者の自作ツールではなく、Cスクリプトを利用する
フォントに使用するhankaku.txtの変換に独自ツールが使用されており、これを回避するためにhankaku.cを作成してイメージに追加する必要がありました。
設定方法は、『30日でできる!OS自作入門』のメモが参考になりました。
参照できないsprintfの代わりに、自作の代用ライブラリを使用する
この項目が一番面倒でした。
どうやら上記のリンカスクリプトでコンパイルすると、Ubuntu環境ではstudio.hのライブラリが参照できなくなるようです。
残念ながら、リンカスクリプトを編集して問題を解決するだけの知識がなかったため、自作の代用ライブラリを使用して、sprintfの代わりをさせることにしました。
自作のsprintf関数は、sprintfを実装する | OS自作入門 5日目-2 【Linux】を参考にさせていただきました。
しかし、こちらを利用した際に、意図した通りに出力がされない問題が発生しました。
具体的には、キーボードの入力値を判定する機能を実装した際に、すべての出力が「2X」となってしまうのです。
それもそのはず、こちらのスクリプトはdかxにしか対応しておりませんでした。
switch(*fmt){ case 'd': len = dec2asc(str, va_arg (list, int)); break; case 'x': len = hex2asc(str, va_arg (list, int)); break; }
そのため、”%02X”は普通に出力されることとなります。
該当ソース部分を”%x”に修正したら解消されました。
ちゃんと読めって話でしたね。
反省。
まとめ
ざっくりですが、『30日でできる!OS自作入門』の10日目まで進めた段階で困ったポイントなどをまとめてみました。
正直理解しきれていないまま進んでしまっている部分もあるので、引き続き勉強していきたいです。