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

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

自作OS

gdbを使うために

gdbとqemuの接続は以前できたけど、ブレークポイントの設定等ができなかった。gdbの機能を使えなかったわけだけど、その原因を教えてもらった。カーネルがELF形式じゃなかったことが問題だったらしい。でも、今の構成をすぐに変えるのは難しいので、アドバイ…

結果に差が…

githubにアップしたos.imgとソースコードをmakeしてできたos.imgに差があるな。os.imgはエラーなく動くのに、ソースコードからmakeするとエラーが起きる。アップしたものに差があったか。そもそもgithubにアップしたソースはMakefileが間違っているのでその…

環境によって実行結果が違う

今、環境によって実行結果が違うという問題に遭遇している。それは2つのPCに入ってるQEMUでまず起こっている。QEMU 0.9.1だと期待通りの動作だが、QEMU 0.10.5だと除算エラーが発生する。IRETDが関わってる所まではわかってるのだが、IRETDで除算エラーが起…

更新

githubに載っけてある自作OSのソースを更新した。USBメモリに入れていたファイルが壊れていたために研究室での作業が進まなかったため、これからこまめに更新していこうかと思う。それで、今回の更新は前回のやつにソフトウェア割り込みを追加した。これから…

ソフトウェア割り込み成功

ちょっと前までエラーがあったのに何故だかRETFによるアプリケーションへの切り替えが成功し、セグメントレジスタにも期待した通りの値が入った。しかし、VRAMへのアクセス位置がずれるという問題が残ってた。DSレジスタの指してるディスクリプタのベース分…

謎の値

今、RETFを使って、CS、EIP、SS、ESPを同時に切り替えようとしている。それで、試しに下のコードを実行してみるとbochsがCSがおかしいと言い出す。それで、そのCSの値を見てみると0x38。しかし、0x38なんて値は入れていない。下のコードのEBXには0x3bがECXに…

SSレジスタの値が変わっていなかった

実行形式ファイルに移動するためにRETFでレジスタの値を書き換えていたが、SSレジスタが書き換わってないことに気づく。特権レベルを下げてないので当然だった。それで、特権レベルを下げて見たところ、qemuでエラーが発生して落ちた。セグメントディスクリ…

原因がわかった気がする

どうやら、データセグメントのベースのぶんだけ、VRAMへのアクセスする位置がずれていたようだ。ベースを偶数にすると、どんどん文字列がずれていくのがわかる。奇数にすると背景色が変わる。しかし、どう対処すればいいのかわからないな。

一般保護例外

実行形式ファイルのエントリポイントへのfar callをやめてretfによるレジスタの値の切り替えを行ったら、qemuのアボートがなくなり、変わりに一般保護例外が発生するようになった。それで下のブログエントリの char* data = new char[segsize]; を char* dat…

DS、ESに値を代入すると落ちる

DS、ESに値を代入すると落ちる。GDTの設定は以下の通り。setGDTの引数はインデックス、ベース、リミット、アクセス権の順になっている。 g_GDTManager->setGDT(7, (uint32_t)data, segsize - 1, 0x4092); dataは char* data = new char[segsize]; としていて…

ELFを実行できた…しかし…

ELFを実行できた。文字列もしっかり表示できるようになった。しかし、callで呼び出したものである。本当ならfar call使わなければいけないはず。しかし、far callを使ったら実行はできるが文字列が表示されなくなった。まぁ、セグメントディスクリプタのベー…

ELFを実行はできたが…

ELFを実行できたが、文字列を読み込めていない。文字列テーブルに入ってることはわかったけど、どうすればいいのかわからない。スタックに積めば…などと思っていたがS准教授に聞いたところ違うと言われて、説明を受ける。…が、どうすればいいのかわからない…

ミスってた

アクセス権がおかしかったことに今気づく。アクセス権を直したら、うまくいった。なんてこった

一般保護例外

qemuでエラー発生。それは一般保護例外だった。原因はfar callにあるっぽい。下のソースのg_GDTManager->setGDTの引数は、インデックス、ベース、リミット、アクセス権の順となっている。g_GDTManager->loadGDTR()はLGDTを呼び出しているだけ。IO::farCallの…

シンボルテーブルの解析成功

シンボルテーブルの解析に成功したようだ。シンボルテーブルの名前インデックスは2つめの文字列テーブルのインデックスっぽい。1つめの文字列テーブルはプログラム中で使われる文字列が格納されてるようだ。実行時にこれをGDTのオフセットとして登録してお…

勘違い

インデックスの意味を勘違いしていた。文字列の配列のインデックスかと思ったら、何文字目かを表すインデックスっぽいな。なんてこった

シンボルテーブルの解析

現在、シンボルテーブルの解析中。それで問題が発生。それはnameの値が文字列テーブルよりでかいこと。エントリが進むにつれて値が大きくなってるので、前のエントリとの差分かと思ったが、objdumpやreadelfとの結果が違う。Googleで検索してみても、文字列…

セクションヘッダテーブル

ELFのセクションはtypeとoffsetはそのまま取得できるからいいとして、名前を取り出すのがめんどくさそう。セクションヘッダテーブルの文字列テーブルから文字列のリストを作ってから、indexでアクセスか。文字列の長さと個数がわからないので、なんかやっか…

セクションの情報発見

セクションの情報を発見した .text 機械語に翻訳されたコード .rodata プログラムで使用する文字列定数 .comment コメント .shstrtab セクション名の文字列のテーブル。セクションヘッダで使用 .symtab シンボルテーブル .strtab 関数名などプログラムで使用…

readelf

最近全然自作OSが全然進んでないな。まぁ、そんなときを乗り越えないとこの先やってけないな。とりあえず、現在readelfコマンドでELF形式のファイルの解析中。ヘッダの種類が3種類あるというのがめんどくさい。1つでいいじゃんと思うけど、まぁ、頑張って…

ファイル読み込みが原因じゃなかった

ファイルの内容を表示させようとしたら、TextVRAMの境界(?)を越えてしまったことが原因らしい。ファイルの内容を表示させないようにしたらうまくいった

エラー

ファイル読み込み時にエラーが発生。sizeが512以下になったときに、エラーがでるっぽい。1回の読み込みで512バイト読み込み、1250バイトのファイルを2回まで読み込んだら、1024バイト分読み込んでくれたが、残りの226バイトを読み込もうとするとエラーになる…

ディスクに書き込むのが大変そう

ディスクの書き込みが思ったより大変そう。1ブロックごとに書き込んでいくので、ある場所に30バイトだけ書き込みたくても、1ブロック書き込んでしまい、ブロック内の他の部分を消してしまう。それを防ぐために1度1ブロック読み込んでおいて、メモリ上で変更…

実行形式ファイル

ファイルを読み込めたはいいが、実行が出来ない。とりあえず、cppなソースをコンパイルしてelfに変換して、これを解析することにした。objdumpを使えば必要な情報は揃うが、自分でやらなければいけない。それで、Googleで『elf ヘッダ』で検索したらELF/実行…

ファイルの一部分の読み込みに成功

ファイルの先頭512バイトを読み込むことに成功した。後はファイル全体を読み込むのみ

ファイル名の取得

ルートディレクトリにあるファイルの名前とサイズを取得できるようになった。ファイル情報は0x2600から始まるので、19セクタ目から読み込んで、ファイル情報を取得。最初に見つけたファイルはシステムファイルみたいで、何故だか名前にNULL文字が含まれてい…

最適化かけなくてもうまくいった

最適化かける前は駄目だったのに元に戻したらうまくいっている。何でだ?まぁ、とりあえず実機でも動いてくれたので良かった。

-O2付けたらうまくいった

gccのオプションに-O2を付けたらtickのところもエラーがでなくなった。変わったこと言えばファイルサイズが小さくなったこと。メモリに読み込んだ位置も64KBより手前で終わってるので、それが良かったのかな?しかし、必要な処理まで最適化で消えてしまって…

問題の部分

TimerManagerのtickが問題だったらしい。呼び出してる部分1行をコメントアウトしたら正常に動いてくれた。しかし、tickの何が問題なんだ?unityTimeを表示させてみるとめちゃくちゃな値が入っている。何でだろう? TimerManager::TimerManager(){ unityTime…

文字列の問題

どうやら、カーネルをメモリに読み込んだ位置が64KBをまたいだのが問題だった可能性が。試しに64KBをまたがないようにサイズを小さくしてみたら、文字列がうまく表示できた。しかしエラーは、まだ続く。qemuでもbochsでも途中で止まってしまう。何でだ?と思…