なんとな~くしあわせ?の日記

JavaとかAWSの設定とかをメモする技術ブログ

アセンブラを再実装してOS自作入門の4日目に到達

nantonaku-shiawase.hatenablog.com

以前進捗報告したのが2016-06-09、それから5ヶ月ぐらい経っているわけですが、ようやく3日目が終了しました。長かった。

これまでの流れ

  1. harib00iに出てくるアセンブリの実装に手間取る → harib00iの実装 · Issue #4 · HariboteLikeHobbyOS/opennask · GitHub
  2. harib00jに出てくるPEヘッダの出力に手間取る → PE(Portable Executable)ヘッダの出力 · Issue #12 · HariboteLikeHobbyOS/opennask · GitHub
  3. CMakeでqemuを実行するスクリプトを準備しまくる → Mocking cyberbird by Hiroyuki-Nagata · Pull Request #8 · HariboteLikeHobbyOS/opennask · GitHub
  4. 先人のサイトを見つけて、リンカスクリプトを使えばショートカットできることに気づく ← 今

2016/11/23時点では、書籍の3日目までのアセンブラ(harib00jまで)はバイナリに変換できるようになった。
使用できるオペコード(部分的に実装しているものも含む)は以下の通り:

  • ADD, ALIGNB, AND, CALL, CLI, CMP, DB, DD, DW, GLOBAL, HLT, IMUL
  • IN, INT, JAE, JBE, JB, JC, JE, JMP, JNC, JNZ, JZ, LGDT, MOV, NOP
  • OR, ORG, OUT, RET, RESB, SHR, SUB

コンパイル〜img書き込みまでの概要

ここまででようやくC言語をリンクしながら、naskのスクリプトアセンブルしてimgに書き込みという一連の動作が完成しました。以下がオリジナルのosaskと、私が先人のページを見ながらCMakeで動かす動作の比較です。

f:id:panzer-jagdironscrap1:20161123230726p:plain

図からわかるように、まずオリジナルのosaskは様々な独自ツール、独自フォーマットを使っています。

それらは以下のように代用できることがこれまでの先人の知恵によってわかっています。

nask

  • naskは大体の人がnasmもしくはgasで代用しています
  • わたしはオリジナルのアセンブラをそのまま使いたかった*1のでnaskを再実装しつつあります。

obj2bim, bim2hrb

  • これはldで代用できます、そしてldはgccから渡せるので、実質使うコマンドはgccのみになります

edimg

  • GNU謹製のmtoolで代用できます

コンパイル〜img書き込みまでのコマンド

私のopennaskを使うと、imgファイル作成までコマンドで7工程です

$ opennask ipl10.nas ipl.bin
$ opennask asmhead.nas asmhead.bin
$ opennask naskfunc.nas naskfunc.o
$ gcc -m32 -nostdlib -Wl,--oformat=binary bootpack.c naskfunc.o -T os.lds -o boot.bin
$ cat asmhead.bin boot.bin > haribote.sys
$ mformat -f 1440 -l HARIBOTEOS -N 0xffffffff -C -B ipl.bin -i haribote.sys
$ mcopy -i haribote.img haribote.sys

スクリーンショット

harib01a 画面が白くなるはずですがバグのため文字が描画されているっぽい*2

f:id:panzer-jagdironscrap1:20161130000326p:plain

harib01a 画面が白くなった!

f:id:panzer-jagdironscrap1:20161202012557p:plain

harib01d 縞模様

f:id:panzer-jagdironscrap1:20161205222833p:plain

感謝

以下の3サイトに非常にお世話になりました

『30日でできる!OS自作入門』のメモ

今後の展望

  • ポートフォリオみたいな感じで見せられるものを増やす、とりあえず30日目までの全てをコンパイル可能にする
  • TravisでCIを回して常にビルド可能な状態にしておく
  • opennaskをGO言語で書き直してクロスプラットホーム対応する

*1:アセンブラを書き直すのが面倒だったので

*2:asmhead.nasアセンブルする際にミスっていたので修正した