2009年9月27日日曜日

bochsデバッガー

作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」

bochs2.4.1のフォルダを見ると、bochsdgb.exeというデバッガーがあります。
ダブルクックして起動、そして、コンフィグレーションをロードしスタートします。
すると

・Bochs for Windows - Display
・Bochs for Windows - Console

という2つの画面が起動されます。
例えば、コンフィグレーションでChapter2のサンプルをスタートするようにしておいて、「Bochs for Windows - Console」のプロンプトで

<bochs:1>pbreak 0x07C00
<bochs:2>c

と打てば、boot.asmの先頭でブレークしてくれます。そこから、ステップ実行する場合は

<bochs:3>s

と打てば良いようです。

詳しくはここにデバッガの使い方があります。

追記

デバッガについてはここにもわかりやすい解説があります。
また、bochs 2.4.1の設定はこちらを参照してください。

2009年9月24日木曜日

NASMチュートリアル

良さそうなチュートリアルですね。

PC Assembly Language

こういうのは是非日本語訳がほしいです。スペイン語、中国語、イタリア語、フランス語はすでにあるようですし。

2009年9月20日日曜日

ページングサンプル動作せず

作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」

ページングのサンプルコード(Chapter8)がNASM2.07とbochs2.4.1の組み合わせではどうにも動作しません。著者の指定しているNASM、bochsのバージョンでは動作するのでしょうか?

狙いは良い本ですし、構成も良いと思うのですが、細かい誤植・誤りが本当に多いですね。ある章ではiretを使い、別の章ではiretdを使う。また、ある章ではeaxを使うが、別の章ではecxを使う。一貫性についてももう少しなんとかなるような。下記URLにも良い指摘がありますので、皆さんも参考にされるのが良いと思います。

http://d.hatena.ne.jp/dogatana/20090609/1244553689

2009年9月13日日曜日

ユーザモードタスクの実行サンプル

作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」

引き続きbochs2.4.1でサンプルコードの動作確認中ですが、Chapter7のkernel_5_User_Task.asmも表示されるはずの文字列が表示されません。

pp.219でisr_128_soft_intはEAXを媒介変数として使うため、PUSHして値(座標値)を臨時に保存しておきPOPすると言ってますが、実際のコードを見ると、そうなってませんね。というわけで


push eax ;; 追加

mov ax, SysDataSelector
mov DS, ax
mov ES, ax
mov FS, ax
mov GS, ax

pop eax ;; 追加

というふうに2行追加したら、ちゃんと表示されました。

2009年9月12日土曜日

キーボード割り込みハンドラサンプルコード

作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」

引き続きbochs2.4.1でサンプルコードの動作確認をしていましたが、Chapter4のkernel3.asmがエラーなく動いているにも関わらず、表示されるはずの文字列が表示されない。

良く見てみると printfの中に

mov byte [es:edi], 0x0 ;; 本文 pp.119

と書いてあるではありませんか

mov byte [es:edi], 0x06


に変更したら、ちゃんと表示されました。

2009年9月6日日曜日

Bochs 2.4.1の設定

「作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」でBochs 2.4.1

Bochs 2.4.1を起動すると、スタートメニューが表れます。



「Disk & Boot」を選択して「Edit」ボタンを押すと、フロッピーとカーネルイメージを選択する画面が表れます。
「Memory」を選択して「Edit」ボタンを押すと、ROM BIOSイメージとVGA BIOSイメージを選択する画面が表れます。



「Browse」ボタンで起動したいカーネルイメージを選択してください。このほかの設定はこの例の通りです。

「OK」ボタンを押してスタートメニューに戻り、設定を「Save」ボタンで保存してください。再びBochsを起動した場合は、「Load」ボタンで設定をロードしてください。

NASM version 2.07が原因でした

「作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 ~ 金 凡峻」

サンプルコードがBochs 2.4.1で動かない、とお伝えしましたが、動きました。Bochsのバージョンの問題ではなかったようです。
boot.asmの中で実行してる

jmp $+2
nop
nop

をNASM version 2.07でコンパイルすると、とんでもないところへジャンプしていたようです。良く読むと、著者はversion 0.99.06を使うよう言ってます。version 2.07とはjmp命令の仕様が異なるようです。

ちなみに、NASM version 2.07では

jmp short flush
flush:
nop
nop

と書きかえることで動作するようになります。Bochs 2.4.1はコンフィグレーションがGUIで設定できBochs 2.3.7より便利です。