2007年10月28日日曜日

2日目:アセンブラの学習とMakefile入門(その2)

文字列の表示処理が、WindowsのDOSプロンプト上で動くものとはちょっと違うようです。
DOSのシステムコールではなくて、BIOSのシステムコールを使うことになるからなので当然?
DOSでは、

  • MOV AH, 0x02 ;1文字出力

  • MOV DL, 0x31 ;"1"の文字コード

  • INT 0x21 ;DOSファンクションコール


でしたが、

  • MOV AH 0x0e ;1文字出力

  • MOV AL, 0x31 ;"1"の文字コード

  • MOV BH, 0 ;

  • MOV BL, 15 ;カラーコード

  • INT 0x10 ;ビデオ関係のファンクションコール


となっています。
BIOSのファンクションコールについては、http://community.osdev.info/?(AT)BIOSに詳細が書いてあります。

2日目:アセンブラの学習とMakefile入門(その1)

1日目では16進数で入力していましたが、アセンブラのニーモニックでの入力に変わりました。

まずは「ORG 0x7c00」でプログラムが読み込まれる位置を指定しています。
独習アセンブラでは「ORG 0x100」とやることが多かったですが、それとの違いはまだ分かりません。
※違いが判明:0x7c00はブートセクタが読み込まれるアドレスだそうです。詳細はhttp://community.osdev.info/index.php?(AT)memorymapを参照。

また、それに伴って、"$"の意味も「ファイルの何バイト目」ではなくて「読み込まれる予定のメモリの番地」になるそうです。

レジスタの話も登場です。独習でも読んでいるのですが、またちょっと違った角度からの話もでていました。

各種の演算にはAXレジスタを使うとプログラムが簡潔になるらしいです。

  • ADD CX, 0x1234 ⇒ 81 C1 34 12 機械語では4バイトの命令
  • ADD AX, 0x1234 ⇒ 05 34 12 こっちは3バイトの命令
と機械語に変換されるので、アセンブラのソースコードでは違いはみえませんが、機械語に翻訳された時点で4バイトと3バイトとなるようです。

著者を疑うわけではないですが、本当にそうなるのか確認してみましょう。
ADD命令のみを書いたアセンブラのソースコードをnasmでコンパイルしてみました。
> nasm add_cx.asm
> nasm add_ax.asm
でコンパイルしたファイルをBzで開いてみると、、、






おお、確かに機械語のバイト数が違いますね。

2007年10月27日土曜日

1日目:PCの仕組みからアセンブラ入門(その3)

バイナリエディタで16進数の値をずらずらひたすら入力したところで、まったく意味がわかりませんでした。
次はもうちょっと分かりやすく、同じものをアセンブラを使ってやってみることになります。
といっても、DB命令(Data byte)やRESB命令(Reserve byte)を使って、これまた16進数を入力するものです。

アセンブラは、著者の川合さんが作成したnaskというものを使うらしいです。
nasmの文法をベースに、プラスアルファの機能を持たせてるようです。

今日の新しい発見は、アセンブラの中で使う"RESB 0x1fe-$"の"$"が先頭から何バイト目かをあらわす変数だったということです。(厳密には違うようですが)
独習アセンブラにはその説明がなかった?ので、意味が分かっていませんでした。

アセンブラを使うやり方では、画面に表示させる文字を好きに変更することができました。
表示される文字列をちょっといじって、こんな感じで完成しました。



これで、1日目が終了です。

1日目:PCの仕組みからアセンブラ入門(その2)

では、Bzで作成したFDイメージファイル(helloos.img)をVMWareで読み込んで起動してみます。

VMware Workstationを起動して、「新しい仮想マシン」をクリックして、新規仮想マシンウィザードを起動します。(「ファイル」⇒「新規」⇒「仮想マシン」をクリックでもOK)


「標準」を選択して次へ。


「Microsoft Windows」で「Windows 2000 Professional」を選択して次へ。

仮想マシン名を入力して次へ。


「ブリッジネットワークを使用」を選択して次へ。

「ディスクサイズ」をデフォルトのまま「8.0」GBとして完了します。


これで仮想マシンが作成されました。FDイメージファイルの「helloos.img」を作成された仮想マシンのフォルダにコピーしておきます。(私の場合は、「C:\Documents and Settings\Username\My Documents\My Virtual Machines\Hello OS」の中)

しかしながら、よくみるとデバイスに肝心の「フロッピーディスク」ドライブが入っていません。

メニューから「VM」⇒「設定」をクリックして「仮想マシン設定」のウィンドウを表示して、デバイス一覧の下の「追加」をクリックします。

ハードウェア追加ウィザードが表示されます。

「フロッピードライブ」を選択して次へ。

「フロッピーイメージを使用」を選択して次へ。

フロッピーイメージとして「参照」をクリックしてさきほどコピーしておいた「helloos.img」を選択して完了。

さあ、いよいよ起動してみます。
「パワーオン」をクリック。。。
きました!起動しました!といっても、、、「hello, world」と表示されただけですが。
終了するには「パワーオフ」をクリックします。
ひとまず初めてのOS?が完成。

2007年10月26日金曜日

1日目:PCの仕組みからアセンブラ入門(その1)

いきなりバイナリエディタで機械語を直接入力するところから始まりました。。。
バイナリエディタ Bz ver 1.62」はいつも使っているので馴染みがあります。
とりあえずは、いわれるがままにやってみましょう。
「helloos.imgをBzで開いた写真」という画像の内容をたよりに、Bzで「EB 4E 90 48・・・」と入れていきます。
途中で随時保存しながら進めましょう。ファイル名は"helloos.img"としておきます。


[000083]から後ろは[168000]までひたすら"00"を入力し続けます。といっても、ある程度ゼロを入力したらコピぺするのが早いです。
[168000]まで入力が完了したら、途中、[0001FE]、[001400]のあたりでゼロ以外を入力するところがあるので、検索フィールドに「>0001FE」とか入れてカーソルを移動して、値を入力します。


ここまで完成したら、次にVMWareでこのFDイメージを起動してみましょう。

0日目:開発を始める前に

まずは序章です。C言語+アセンブラを使ってOSの開発をしていくようです。
とりあえず、「ほとんど知識を要求しません」とか「知らなくてもいいようにていねいに説明しています」と書いてあるとはいえ、ざっと読んだ感じでは、きちんと理解するにはアセンブラを多少なりともわかっているほうが良さそうでした。なので、事前に「独習 アセンブラ」を読んでアセンブラに馴染んでおきました。

全体としては、
  1. WindowsでCのソースプログラムを書く
  2. Cコンパイラでコンパイル
  3. コンパイルしたファイルからFDイメージを作成
  4. イメージファイルをディスクに焼く

という大まかな流れで進めていくようですが、FDDがあるPCが手元にないので、VMWareで起動ということになりそうです。

完成までの道のりとしては、

  • 第一週
    最初はアセンブラでディスクからOSを読み出すプログラム=ブートローダー?を作る。
    その後で、C言語で画面表示とかを作りこんでいく。
  • 第二週
    この時点で、C言語とアセンブラをある程度マスターした状態になっているらしい。
    「アルゴリズム」についてお勉強することになるみたい。
  • 第三週
    マルチタスクのあたりを作りこんで、アプリを作るらしい。
  • 第四週
    OSを多機能にして、サンプルアプリを作る。
    日本語表示にも対応。
  • おまけの2日
    仕上げ。

ということです。本当にできるのか。。。

2007年10月24日水曜日

OS自作の道のはじまり

OSを自作する?アセンブラもC言語も素人なのでなんだか難しそうですが、「30日でできる! OS自作入門 (川合 秀実著)」を片手に最後までがんばってみようかと思います。
ということで、このブログは自作OS完成までの道のりの覚書です。