自作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による実装』をAmazonで買うことにした。新品を買うと9240円もするけど、中古で1500円で売ってたのでそれを買うことにした。ただCDはついてこないらしい。まぁ、本に書いてあることを理解できれば、CDがな…
今作っているOSの参考になったMona OSは、MITライセンスなので、著作権表示が必要だ。どう書けばよかったわからなかったので、ひげぽんさんに問い合わせたところ ・主要なソースの1つのコメントヘッダに mona/core/kernel/kernel.cpp の一番先頭にある /* */…
今回のLOCK prefix unallowedの正体はJavaでいうNullPointerExceptionだった。NULLが代入された変数からメンバ関数を呼び出そうとしてた。なんてこった
またLOCK prefix unallowedというエラーがでた。qemuは相変わらず落ちてしまう。今度は何が原因だ?
どうやら、virtualを付けた関数に = 0を付けてないところがあったのが問題だったようだ。以下のようにしたら動いた。 virtual void hoge() = 0;
_ZTV3Nicというラベル自体が見つからなかった。そりゃエラーでるな。どうしてラベルがないのかはわからないけど
昨日のエラーがでてたと思われる部分をg++で出力したgasから抽出した。movl $_ZTV3Nic+8, (%eax)ってところが怪しいのかな。+8って何を指してるのだろう? _ZN3NicC2Ev: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax movl $_ZTV3Nic+8, (%eax) popl %ebp …
コンパイルしてたらエラーが…、メッセージは↓の通り NE2000.o: In function `Nic::Nic()': NE2000.cpp:(.text._ZN3NicC2Ev[_ZN3NicC2Ev]+0x8): undefined reference to `vtable for Nic'Googleで検索してみると、virtual宣言した関数に処理を定義していない…
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を実装しようとしているのだがinvalid conversion from ‘void*’ to ‘char*’とコンパイラに怒られてしまう。char*に変換できなければバイト単位のアクセスができないんじゃないか?どうすればいいんだろう?
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経由でのフロッピーへの書き込みに成功した。一歩前進
sectorの値を0にしていた sectorの値は1かららしい 待機なしにリザルトステータスの読み込みを行っていた (IOポート0x03f4から読み込んだ値 & 0xC0)が0xC0になるまで待ってからリザルトステータスを読み込まなければいけない
bochsでもFDC経由でフロッピーを読み込ませることに成功。どうやら、コマンドの結果を読み込むのが早すぎたのが問題だったらしい。しっかり準備ができるまで待機させないといけなかったな
qemuではしっかり読み込んで期待通りの文字列を取得できたが、bochsだと失敗する(ST1が2になっていて、期待通りの文字列を読み込めていない)。両方の結果が違うなんて今までもよくあったことだ。そのうち、なんとかなるだろう