忍者ブログ
2024.11│ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
プログラミング関連での備忘録なんかを載せています。
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール
HN:
たっく
年齢:
42
性別:
男性
誕生日:
1982/03/11
職業:
システムエンジニアなの?
最新コメント
最新トラックバック
ブログ内検索
アーカイブ
アクセス解析
2024年11月23日 (Sat)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2009年11月07日 (Sat)

それでは、2日目をはじめます。

1日目は、バイナリエディタで直接、ブートできるフロッピーディスクを作成する事と、同じ物をアセンブラを使用して作成しました。

2日目は、「アセンブラ学習とMakefile入門」です。
1日目に作成したアセンブラのソースでは、まだプログラム本体の機械語を直接DB命令で書いています。
今回は、その部分をアセンブリ言語に直すことをします。


「30日でできる!OS自作入門」を読みながら、修正します。

まず、ソースの先頭に、「ORG 0x7c00」を記入します。
これは、メモリ上のどの位置にこのプログラムが読み込まれるかと言うのを
アセンブラに教えている物の様です。

その下に、「JMP entry」を記入します。
これは、プログラム本体につけたラベル部分に飛んでねっていう命令です。
あと、JMP命令を書いたことで「DB 0xeb, 0x4e, 0x90」の部分の最初の0xebと0x4eが消せます。
これは、「JMP entry」相当の機械語だったためです。(0x90はまた別なのでこいつだけ残しておきます。)


また、プログラム本体を、以下の様に書き換えます。


; プログラム本体
entry:
        MOV     AX,0            ; レジスタ初期化
        MOV     SS,AX
        MOV     SP,0x7c00
        MOV     DS,AX
        MOV     ES,AX

        MOV     SI, msg

putloop:
        MOV     AL,[SI]
        ADD     SI,1
        CMP     AL,0
        JE      fin
        MOV     AH,0x0e
        MOV     BX,15
        INT     0x10
        JMP     putloop

fin:
        HLT                     ; 何かあるまでCPUを停止
        JMP     fin             ; 無限ループ

msg:
        DB      0x0a, 0x0a      ; 改行2つ
        DB      "hello, world"
        DB      0x0a            ; 改行
        DB      0

        TIMES   0x1fe-($-$$) DB 0       ; 0x001feまでを0x00で埋める

        DB      0x55, 0xaa


大分、プログラムらしくなって来ました。

ソースの解説をみると、大事なところはこんな所でしょうか。
  • ORG命令はプログラムの起点となるメモリの位置をアセンブラに教える為に使う。今回の場合、 「0x7c00」になっているのは、PC/AT互換機の仕様で、ブートはそこから必ず始めなければいけないと決まっているから 。
  • JMP命令は、指定したメモリの番地に強制的に飛ぶ。ラベルが指定されている場合は、そのラベルがついた位置へ飛ぶ。(この場合、entry:ラベルの次のMOV命令のところに飛ぶと思う)
  • MOV AX,0」はC言語の「AX=0」と同じ意味になる。
  • AXとか、SSとかはレジスタ(メモリよりも早くて容量が小さい記憶領域)
  • [SI]という形で代入された場合は、レジスタではなくメモリの位置になる。(よ〜くみると、メモリっぽい形にみえるかも・・・)
  • CMP命令とJE命令は、一塊でC言語のif文相当の命令を書ける。
  • HLT命令は、CPUをちょっとだけ休止させる。(sleepと同じ様な命令だとおもう)


今回はここまでです。
次回は、2日目のその2として、アセンブラでフロッピーイメージを作るのは無駄が多いので、ブートセクタだけを作る様に変更しましょ。ついでにMakefileを使いましょ。と言うことの様です。


--
勘違いしている箇所があれば、指摘して頂けると助かります。

PR
2009年11月07日 (Sat)

1日目 その2です。

今回は、アセンブラを使用してブート部分を作ります。
「30日でできる!OS自作入門」の中では、DB命令でバイナリエディタがわりに1byteずつ埋めるなんて荒行まで載っていますが、正直そんなのは面倒くさいのと、やっても得る物は少ないと感じたため、その後に書いている、ソースっぽい部分まで飛びました。

ソースっぽい所は真面目に打ち込みます。
ファイル名は、「helloos2.asm」です。
f7fa0758.png

よし、打ち込みました。

さて、「30日でできる!OS自作入門」ではnaskというアセンブラを使用している様です。
naskと言うのは、著者がnasmを改良して作った物らしいですが、私はせっかくなのでnasmを使用したいと思います。
※やっぱり標準的なものを学びたいですし。

と言うことで、nasmをインストールして、
$ nasm helloos2.asm -o helloos2.img
を打ち込みました。

・・・
・・・・・・
・・・・・・・・・

helloos2.asm:39: error: invalid operand type
helloos2.asm:48: error: parser: instruction expected

エラーでとります・・・


調べてみたら、どうやら命令間違ってるよといわれているみたいです。
ネットで検索したら、nasmとnaskの違いという物がある様で、
どうも、RESB命令はnasmで推奨されていないのと、書き方が異なる様です。

これは、あえてnasmを選んだのでしょうがないです。

nasmではTIMES命令を使用するとうまくかけるようなので、
書き直します。

56425e2b.png

こんな感じでRESBを使っているところを書き直しました。

そんで、アセンブルします。
$ nasm helloos2.asm -o helloos2.img

今度は、問題なくできました。

helloos2.imgができているので、1日目-その1と同じように、
VMWareでフロッピーイメージとして読み込んでみます。

dbdc8861.png

お〜、ちゃんと表示されました。


と言うところで、1日目終了です。
内容は、さっぱり分かりません。

今日のところは、ブートするところまでを自分で作ってみると言うところに意義があるのだと思います。

次回、2日目は、「アセンブラ学習とMakefile入門」です。

2009年11月07日 (Sat)
さて、1日目を始めます。

1日目の最初をざっと読むと、とりあえずブートローダーの部分だけを作ってみようと言う事の様です。

「30日でできる!OS自作入門」はWindowsを開発環境としてに書かれているのですが、私はWindows VistaでMicrosoftに愛想を尽かして、Ubuntuに乗り換えた人間なので、開発も基本的にUbuntu上でやっていきます。
※著者のホームページにはLinuxでの開発方法と言うのも載っている様ですが、まだ見ていないです。できるだけ、自分であれこれ悩んで進んでみようかなと思っています。

と言うことで、「30日でできる!OS自作入門」に書いている内容をそのままトレースではなく、色々悩む部分がでてくると思います。

まず、バイナリエディタです。Windows歴が長かったもので、Linuxのバイナリエディタを知りません。

ネットで調べたところ、普段使っているvimでバイナリ編集出きるとのことでした。

早速やってみます。
コマンドラインで、
$ vim aaa.bin
を実行します。

aaa.binファイルに適当な文字列を入れて保存します。

そしたら、今度は「:%! xxd」とコマンドを打ち込む事で、バイナリを編集できる様です。

ちょっとバイナリをいじってみました。
いじった後で、
「:%! xxd -r」を実行してテキストに戻すと、たしかに編集できている様です。

ですが!

やたらと編集しづらいです。
使い方が分かっていないせいもあるんでしょうが、バイナリモードで00をずーーーっと埋めたい場合に、そのままずーーっと00を書いていって、テキストモードに戻したら、1行分しか追加されていません。

「30日でできる!OS自作入門」を読むと、大量に00を埋める箇所があるので、これでは困ります。

方法はあるのかもしれませんが、バイナリエディタなんて最初しか使わないだろうと思い、ここは手を抜くことにします。
※本当は、こういうところを突き詰めていくと勉強になるんですが・・・・・・

GUIのツールないかな〜と調べたところ、「GHex」と言う物がある様です。
Ubuntuのリポジトリにもあるようなので、Ubuntuの「アプリケーションの追加と削除」で「GHex」を入れました。簡単にアプリケーション追加できるのが、Ubuntuの魅力ですね。

ってことで、早速バイナリファイルの編集をしました。
「30日でできる!OS自作入門」をみながら、入力していきます。
ファイル名は「helloos.img」です。

e60eed3c.png

最初の部分をサクサクと入力して、途中から00で埋めていきます。
面倒くさいです・・・・コピペをしようとおもったら、文字はコピペできるのに、00はコピペ出来ない!

これは困った仕様だ!

しょうがないので、一旦文字を入力して、後で置換する方法をとりたいと思います。
埋める文字は、何でもいいですが、とりあえず他の箇所で使われていなかった「a」を使用しました。

c1585f68.png

で、置換っと。
4aabe45e.png

c19cb400.png

これで、問題なく00埋めが出来ました。

あとは、「30日でできる!OS自作入門」に書いている様に、
途中の00以外のところを埋めてっと、
d5568ee9.png

2fdbb938.png


これを保存してイメージファイルができました。

さて、これでフロッピーにこのイメージを書き込んで、PCに入れて起動させれば、画面に「hello, world」が表示されるはずですが、生憎フロッピーを持っていません。
あと、実機でこんなの試したく無いです。

と言うことで、VMWareを使用します。
この前、普段使っているPCにVMWarePlayer3.0をいれたので、ちょうどいいです。

仮想マシンを作って、先ほどバイナリエディタで作ったイメージファイルを、フロッピーのイメージとして読み込んで、起動します。
b86ee104.png

おお〜「hello, world」が表示できました。

次は、アセンブラを使用して今回と同じ物を作ります。

2009年11月07日 (Sat)

川合秀美さん著の、30日で出来る!OS自作入門をやっていこうと思います。

本当に30日で出きるとは思ってないですが(それ以上かかると思ってます)、
すこしずつ学んでいけたら良いなと思います。

Prev1 2