マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

自作OS

文字列の問題はまだ残っていた

文字列が正しく表示できたと思っていたが、何故だか4文字しか表示できない。イメージファイルをバイナリエディタで開いてみると、しっかり4文字以上の文字列が書き込まれているのに。相変わらず、1文字ずつ代入していく方法だと全部表示できる。なんでだ…

新たなエラー

文字列が意味不明な文字列になってしまう問題はリンカのオプションを変え忘れたから起こった問題だった。無事文字列が表示されるようになった。しかし、新たなエラーが発生write_virtual_checks(): write beyond limit, r/w何だ?これは

構造を変える

今まではfirstboot.bin、secondboot.bin、third.binをcatでくっつけただけだった。ただ、こうするとファイルシステムが構築できなさそうなので os.img : ${FIRST} ${SECOND} ${THIRD} Makefile cat ${FIRST} ${SECOND} ${THIRD} > $@としてたところを os.img…

Minix本を買うことにした

『オペレーティングシステム―設計と理論およびMINIXによる実装』をAmazonで買うことにした。新品を買うと9240円もするけど、中古で1500円で売ってたのでそれを買うことにした。ただCDはついてこないらしい。まぁ、本に書いてあることを理解できれば、CDがな…

著作権表示

今作っているOSの参考になったMona OSは、MITライセンスなので、著作権表示が必要だ。どう書けばよかったわからなかったので、ひげぽんさんに問い合わせたところ ・主要なソースの1つのコメントヘッダに mona/core/kernel/kernel.cpp の一番先頭にある /* */…

NullPointerException

今回のLOCK prefix unallowedの正体はJavaでいうNullPointerExceptionだった。NULLが代入された変数からメンバ関数を呼び出そうとしてた。なんてこった

LOCK prefix unallowed再び

またLOCK prefix unallowedというエラーがでた。qemuは相変わらず落ちてしまう。今度は何が原因だ?

動いた

どうやら、virtualを付けた関数に = 0を付けてないところがあったのが問題だったようだ。以下のようにしたら動いた。 virtual void hoge() = 0;

問題の部分 その2

_ZTV3Nicというラベル自体が見つからなかった。そりゃエラーでるな。どうしてラベルがないのかはわからないけど

問題の部分

昨日のエラーがでてたと思われる部分をg++で出力したgasから抽出した。movl $_ZTV3Nic+8, (%eax)ってところが怪しいのかな。+8って何を指してるのだろう? _ZN3NicC2Ev: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax movl $_ZTV3Nic+8, (%eax) popl %ebp …

undefined reference to vtable

コンパイルしてたらエラーが…、メッセージは↓の通り NE2000.o: In function `Nic::Nic()': NE2000.cpp:(.text._ZN3NicC2Ev[_ZN3NicC2Ev]+0x8): undefined reference to `vtable for Nic'Googleで検索してみると、virtual宣言した関数に処理を定義していない…

memcpy作り直し

memcpyをMOVSBを使って作り直した。MOVSBは[DS:ESI]にあるバイトを[DS:EDI]にコピーする命令。DF(ディレクションフラグ)の状態に応じてESIとEDIをインクリメントか、デクリメントする。今回はCLD命令でDFをクリアして、インクリメントさせている。そしてMOVS…

まだ甘かった

下のコード、3つめの引数に関わらず1byteコピーしちゃうね。1回はコピーが行われてしまうので先に条件分岐をしないといけないな

甘かった

どうやら、いろいろ甘かったようだ。h.d.kさんに教えてもらったことだけど、下のアセンブラはまずいらしい。DECはキャリーフラグを更新しないらしい(独習アセンブラにも書いてあった)。そしてJAはキャリーフラグをチェックしているらしい(これも独習アセンブ…

昨日書いたアセンブラ

CMPいらないんじゃないか?演算結果が0になればいいことだし memcpy: MOV EDI, [ESP + 4] MOV ESI, [ESP + 8] MOV ECX, [ESP + 12] memcpy_loop: MOV DL, [ESI] MOV [EDI], DL INC EDI INC ESI DEC ECX JA memcpy_loop RET

アセンブラで書くことにした

memcpyをアセンブラで書くことにした memcpy: MOV EDI, [ESP + 4] MOV ESI, [ESP + 8] MOV ECX, [ESP + 12] memcpy_loop: MOV DL, [ESI] MOV [EDI], DL INC EDI INC ESI DEC ECX CMP ECX, 0 JA memcpy_loop RET これでいいんだろうか?アセンブラはよくわか…

memcpyを実装しようとしているのだが…

memcpyを実装しようとしているのだがinvalid conversion from ‘void*’ to ‘char*’とコンパイラに怒られてしまう。char*に変換できなければバイト単位のアクセスができないんじゃないか?どうすればいいんだろう?

githubに載せてみる

githubに自作OSのソースを載せてみた。結構パクリが多いけど http://github.com/d-kami/d-kami-OS/tree/9287697b7d75fb2a980bc451f1971486c0023604/os

命名規則がばらばら

アセンブラのラベルの命名規則がばらばらなことに気づいた。統一しなければ

ソース整理で大慌て

自作OSの一部のソースを整理していたら、急に自作OSが動かなくなってしまった。なんでだ?と思ったらアセンブラのソースにRETを忘れてる箇所があった。今までも忘れたままだったけど、その先のコードが無害だったため、無事に動いていたわけだ。今回の整理で…

手抜き良くない

どうやら、状態チェックを一部手抜きしたせいで実機でのフロッピーの読み書きが出来なかったようだ。実機でもうまくいったので次行こう!

勘違い、割り込みは発生していた

calibrateコマンドを送るときに待機を忘れていて、続けざまにコマンドを送ってたのが問題だったらしい。割り込みは発生したが読み込みはできず。ステータスレジスタに値が入ってた。コマンドが異常終了してたらしい

割り込みが発生しない

俺の環境ではFDCにcalibrateコマンドを送っても割り込みが発生しないらしい。calibrateコマンドを送ったあとも止まらずに先に進んでるから成功はしてるんだろうか?わからないから恐いな

割り込みが発生してない?

FDCの割り込み時に文字列を表示させるようにして、もう一度実機で動かしてみたが、その文字列が表示されない。ただ、2つのタスクがカウントアップしてる数字は表示されてるのでタイマ割り込みは発生してるようだが

実機で動いた

今日、初めて実機で動かすことに成功。しかし、フロッピーへの書き込みは失敗した模様。そして読み込みもできなかったようだ。割り込みが発生したかどうかやリザルトステータスを表示させてなかったので原因不明。これからは原因不明にしないように気をつけ…

状況

今のところできること キーボード割り込み、タイマ割り込みを処理 TSSを1つだけ使ったマルチタスク FDC経由でフロッピーを一部読み書きできる 今のところの次の目標 フロッピーの操作を増やす スクリーンショット KDE+Bochsだとものすごく遅くなる。なんで…

フロッピーへの書き込み成功

FDC経由でのフロッピーへの書き込みに成功した。一歩前進

FDC制御でミスしてたところ

sectorの値を0にしていた sectorの値は1かららしい 待機なしにリザルトステータスの読み込みを行っていた (IOポート0x03f4から読み込んだ値 & 0xC0)が0xC0になるまで待ってからリザルトステータスを読み込まなければいけない

bochsでも読み込めた

bochsでもFDC経由でフロッピーを読み込ませることに成功。どうやら、コマンドの結果を読み込むのが早すぎたのが問題だったらしい。しっかり準備ができるまで待機させないといけなかったな

フロッピーを読み込めたと思ったが…

qemuではしっかり読み込んで期待通りの文字列を取得できたが、bochsだと失敗する(ST1が2になっていて、期待通りの文字列を読み込めていない)。両方の結果が違うなんて今までもよくあったことだ。そのうち、なんとかなるだろう