ウォンツテック

そでやまのーと

OS作成 - シェル編

シェルで引数を渡せるようにしようと思い、ユーザライブラリを整備していたのですが、どうもprintfやらputsを呼ぼうとするとpage faultになってしまう。色々原因を探っていたのですが、最終的に呼ばれるwrite(..)をcallした所でpage faultが発生している模様で、qemuでそれが置かれている仮想メモリアドレス上を見てみると確かに0x00になっていておかしい。カーネルがロードする前のバイナリをobjdumpするとちゃんとwriteも書かれているのでどうやらelfloaderがおかしいと思い、試しにelf program headerのsizeを"readelf -e"とelfloader.c内部で取得している値を比較してみるとelfloaderの方で正確に読み込めていないようでした。

違った

program headerは正確に読み込めているようでした(上はsection headerと勘違い)

追記

 原因はファイルシステム作成ツール(kmkfs.cpp)でファイルのサイズを取得するのにC++ istreamクラスのgcountを使っていたのですが、これがどうもファイルサイズそのものでは無かったみたいで、これをCのstruct stat構造体から取得してくる方法に変えました。あとはプログラムヘッダーに塵(ファイルサイズ0)があり、それが仮想メモリアドレス「0番地」に1BLOCK(4096Byte)分、不定な値を書き込んでしまう問題を修正。また、ext3_openでファイルが存在しない時にファイルディスクリプターをインクリメントし、その値を返り値としてしまうのも修正。

ユーザ空間用のメモリ

 allocをどうやって実装しようか悩み中。heap領域をプロセス属性にしてkernelで管理すればsystem callで呼び出せるけど、allocするたびに呼び出すことになる。やっぱ初期領域を用意してその領域をkernel内部と同じ方法でプロセス空間側で管理して足りなくなったらbrkみたいなシステムコールで拡張って方式にしようかな。