ウォンツテック

そでやまのーと

sodex

OS作成

カーネル内部からのスイッチを許可するマルチプロセス化についに成功しました。細かいデバッグを毎日少しずつ行い1ヶ月くらい掛かりましたorz。とりあえず4プロセスくらいをinit_process時に登録し、それらをPIC timerでswitchingさせていき、数分間放置して…

OS作成

1プロセスのkernel to kernelスイッチはほぼ正常に動作中。複数プロセスの方もなんとなく原因はつかめた。各プロセスにkernel内部用のstackを持たせてそれらをスケジューリングの初っ端かiretする直前に切り替えないといけない。でもkernel to kernelかuser …

OS作成

一般保護例外地獄から脱出したと思ったらページフォルトが発生。 でもなんとか1プロセスならkernel内部からでもプロセススイッチが出来るようになったっぽい(ただしespの戻しが不完全なせいか、数回のスイッチでページフォルトになるけどorz)

OS作成

混乱してきたからメモ スケジューリング用割り込み(timer割り込み)を禁止しているはずなのにfdcの読み込み時に(スケジューリング)割り込みが発生している PICの特定bitをマスクするだけで特定の割り込み禁止出来なかったっけかなー 割り込み時のcsの値判…

OS作成

スケジューリング割り込み回りとkernel ⇔ user mode変更回りを大幅変更。しかしうまく動かず。 追記 そうかそうか。最初にスケジューラを起動した時にiret用のstackに埋め込んだeflagsが0だった(次回以降はnextプロセスのeflagsが埋め込める)ので割り込み…

OS作成

qemuが原因なのか、512バイトのfirstboot時にBIOSのFD読み込み機能を使ってfloppyから最初のセクタを読み込むところでエラーになる。最初はqemuのBIOS実装が原因かと疑い以下のようにbochsのBIOSバイナリをコピーして起動してみたけど再現したのでqemuの本体…

OS作成 - シェル編

Privilege Levelの異なる場合での割り込みを検知しようと思いIntel manualの以下のようなCPUの擬似コードを熟読していたけど、どうやらeflagsなどでの検知はできないみたい。期待としてはRETURN-TO-OUTER-PRIVILGE-LEVELのところでCPUがeflagsのなんらかのビ…

OS作成 - シェル編

read(0, .., ..)でキーボード割り込みをカーネル内部でwaitする事になるのだけど、その場合いつまでも待てないので当然その他の割り込み特にスケジューリング用の割り込みは許可する。現状の実装ではカーネル内部から内部へのスイッチ(Privilege Level 0か…

OS作成 - シェル編

sodexファイルシステム上に/usr/bin/helloで中身hello worldなテキストファイルを設置し、open, read, writeする事が出来たので次は標準入力のシステムコールを書こうと思ったのですが、割り込みのwaitを書かなくてはいけない事に気づきました。これは今まで…

OS作成 - シェル編

シェル編という事で今作成してあるシステムコール(open, write, read等)用の静的ライブラリを作成中です。それぞれのシステムコールに対応するファイル(open.S, write.S等)を用意しそれらをarで固めました。libc.aを生成するmakefileとプロセスを生成する…

OS作成

ユーザプロセスが複数実行されない問題を修正。リストに挿入する汎用関数が間違えていました。sodex rev.28

OS作成

ユーザ用プロセスのためにファイルシステム生成回り(kmkfs.cpp)を改良。 sodexファイルシステム上の/usr/bin以下に設置したファイルを全て読み込んでおくことにしました。その他ファイルシステム構築時の細かいところも修正。 また、簡単なcrt0.Sとシステム…

OS作成

プロセス用のスタック領域がカーネルのメモリ領域(0xC0000000-)になっていたのをプロセス用スタック領域として0xbfffe000-0xc0000000を用意しプロセススイッチ時のespを切り替えるように変更。 プロセスがカーネルモード時(システムコールやスケジューリン…

OS作成 - elfローダ編

elfヘッダ(elf header, elf section header, elf program header)を読み込んでヘッダの中身を解析し、メモリ上にロードする単純なelfローダを実装いしました。ユーザプロセスの仮想メモリ位置はLinuxと同じ0x8048000に配置。というのも開発環境がLinuxなので…

OS作成 - elfローダ編

Linkers & Loadersを斜め読みしました。例によって理解度は3%くらいなのですが、自分には知らない事が盛りだくさん(ライブラリのメジャー、マイナーバージョン規則やダイナミックリンクの手法等)あったので収穫は大きいです。ただ特定のフォーマット(elf…

OS作成 - ページング&プロセス編

ユーザプロセスのPrivilege Levelを3にする事に成功。 やり方はLinuxに近いけど以下のようにespから0x80離れたかなり深いスタックにあるiret時のeip,cs,eflags,ss,espを強制的に上書きしました。 ※asm_process_switch, i20h_process_switch, switch_toと3つ…

Linuxのpriviledge levelを切り替える辺りのコードを見てみる。

Linux 2.6.18 fs/binfmt_elf.c 1017行目あたり start_thread(regs, elf_entry, bprm->p); if (unlikely(current->ptrace & PT_PTRACED)) { if (current->ptrace & PT_TRACE_EXEC) ptrace_notify ((PTRACE_EVENT_EXEC << 8) | SIGTRAP); else send_sig(SIGTRA…

OS作成 - ページング&プロセス編

sodex rev.22 プロセスの生成に成功。execveシステムコールを作成し、ファイルシステム上のファイルをext3_readでプロセス用物理メモリにロードし、ページングでそれをリニアアドレス0x0〜部分と関連付けました。まだopenしたファイルのデータとプロセスの関…

OS作成 - ページング&プロセス

プロセスのテスト中に、1度PICタイマーのハードウェア割り込みが発生した後に一切のハードウェア割り込みが発生しないという問題が起きて悩んでました。このPICタイマーを利用してプロセスのスケジューリングを行わせようとしているのですが、どうやらその処…

OS作成 ページング&プロセス編

最初のユーザプロセス生成に際し、前に考えたメモリマップを少し変更。カーネル部分のページングによるアドレス変換はリニアアドレス0xC0000000〜0xC2000000(32MB)に対して物理メモリ0x0〜0x2000000を割り当て。プロセスの.text部分のページングによるアドレ…

OS作成 - ページング&プロセス編

簡易システムコールとテスト用プロセスの実行ファイルを作成。 とりあえず実行ファイルをファイルシステム作成ツール(kmkfs.cpp)で直接ファイルシステムに埋め込んでおいてkernel.cで.data部分の文字列をext3_readで読み込み、システムコールで表示するとこ…

OS作成 - ページング&プロセス編

非TSSタスクスイッチ時のPriviledge Levelの推移を中心に考察(というかマインドストーミング) 1. カーネルをユーザプロセス(init)に移行させるにはどうするか。 CPL0で稼働しているカーネルをCPL3に移行する必要がある。 現在書いているコードのスイッチ部…

OS作成 - ページング&プロセス編

昨日commitした部分、まったくページング出来ていませんでした(汁。。 cr3レジスタにはpage directoryの物理アドレスを入れなければいけないのに、仮想アドレスを入れていました。 試しにpage faultが起こるかpage directoryに設定していない0x1000000にア…

OS作成 - ページング&プロセス編

カーネル用仮想メモリマップのためのページング部分を実装。以下の2段階の処理によりマッピングしています。 1. セカンドブート後のstartup.S中で仮ページングテーブルを設定し、ページングサイズ4KBのPage Tableを1024x2 8MB分用意し、仮想アドレス0x0と0xC…

Linuxの初期ロード時のメモリ配置

sodex開発のため、Linuxの初期メモリ配置、ページングを勉強。 Linuxの初期メモリ配置をカーネルのコードとリンカスクリプトから見てみる。 まずはLinuxのブート時のファイル構成から(ブートローダを使わない場合の構成。※Linux2.6からはbootsect.SのFD読み…

OS作成 - ページング&プロセス編

sodexのページング時のメモリマップを考えました。 最初はMonaで採用しているカーネル領域を物理メモリの先頭に固定して割り当てようかと思ったけどそれだとプロセスのリニアアドレスが先頭から割り当てられなくなりプロセス用実行ファイルのコンパイル時に…

OS作成 - ファイルシステム編

ファイルシステムの実機テストをしていたら書き込み専用のUSB FDがお亡くなりに。。シクシク なぜか9セクタ連続で読み込む事が出来ないバグの原因を探っている最中でした。。 もうレガシーFDは捨ててUSBメモリをメインに開発したくなってきた。。でもBIOSのUSB命…

OS作成 - ファイルシステム編

ext3_write, ext3_mkdir 実装完了 openしたファイルの書き込みと新規ディレクトリ作成APIを実装。また、48KB以上のファイルが生成出来ない部分も修正し現在では4MB+48KBまでのファイルが生成可能。これで基本的なファイルシステムの実装は一段落。残りのrena…

OS作成 - ファイルシステム編

よくわからないバグに遭遇。 関数定義だけはしているが他から一切呼ばれていない関数がコンパイル後に悪さをしている。。 具体的に言うと以下が問題の部分。 PUBLIC void __change_parentdir(ext3_dentry* parent, ext3_dentry* child) { char* p = parent->…

OS作成 バグ解明

謎は全て解けた カーネルサイズに依存して挙動がおかしくなるバグの正体それは、、、ありえないミスだった。。 0x9036bから0x90374の10バイトが0で埋まる現象を突き止めてから、逆アセンブル、hexdump、そして正常時、異常時のオブジェクトのhexdumpのdiff、…