ウォンツテック

そでやまのーと

sodex

USB

qemuのUHCIのQHリストは100個までしかチェイン出来ないのか。 意味不明なところでbulk in出来なくなってはまった。 qemu-0.10.5/hw/usb-uhci.c #define FRAME_MAX_LOOPS 100 static void uhci_process_frame(UHCIState *s) { uint32_t frame_addr, link, old…

USB boot

BIOSの拡張ディスクアクセス用のファンクションコール0x13, ah = 0x42の1回で読み込める最大セクタ数は0x7fまで。 にしてもBIOSって便利。 プロテクトモードでUSBメモリにアクセスするには - PCI回り理解して - UHCI Controllerの仕様理解して - USBのBulk転…

usb mass storage

sodex on qemuでusbメモリ(usb mass storage class)の1セクタ読み込みに成功したぽ。 USBは自作OS界隈でもやってる人がほとんど居ないので仕様を読み込むのに苦労しました。 そのうち実装に必要な知識をここで書きます。 row device ext3_read, ext3_write…

正規表現ライブラリ

昔書いた正規表現パーサ(DFA型)をsodexに移殖。ユーザーランドで使えます。 regex.c これでsodex上でインタープリターでも書こうかと思ったけど文字クラスとか括弧'('自体を扱えなかったりするので全く使い物にならない罠orz

実機

USB FDDを買ってきたので久々に実機でsodexを動かしてみる。が動かない。 そういえば8セクタ以上の読み込みが失敗していたような(汁

OS作成 - NIC編

ようやくNICのsend部分がうまくいきました。ne2000上のバッファRAMのアドレスの割り当てがまずかったようです。これがおかしくてDMA書き込みが出来ていなかった模様。 テストでsource mac addressを[1.2.3.4.5.6]に、destination mac addressを[ff.ff.ff.ff.…

OS作成 進まない

最近忙しいです。まぁ完全に僕の能力不足により忙しいのでそれはそれでいいのですがNICドライバの開発が全く進みません。なんかremote DMAの転送がうまくいってません。DMAバッファに書き込まれている様子がない。。あと水曜までに書かなければならないある…

OS作成 - NIC編

ne2000 NICドライバ実装中。 qemuはne2000に対応してるけどやっぱ実機でテストしたい。今度互換NIC探してこようかな。

OS作成 - NIC編

さて、いよいよNIC編をスタートさせました。TCP/IPの実装(または移殖)はsodex開発当初からの最上位課題で、その土台であるNICドライバの開発に取り掛かります。対象のNICは有名なNE2000とします。 NE2000ではDP8390という制御コントローラを使用しており、…

OS作成

NE2000の仕様読んでます。 初期化送受信自体はそれほどむずかしくなさそう。

OS作成

mallocにややこしいバグが。。。カーネルからユーザランドにポインタ経由で渡した構造体の要素がおかしな値になってる。と思ったらユーザランド用のヘッダーファイル更新ミスでした(カーネルと共有しないとまずいよなぁ常識的に考えて。。)

OS作成 qemuのバグ?

またしてもカーネルサイズに依存して起動できない問題が発生。しかし今回はbochsでは起動出来るのでどうやらqemuが怪しい気がしてきました。qemu本体というよりint 0x13のBIOSシステムコール(FDCからの読み込み)が失敗してるのでqemuが使ってるBIOSの方く…

OS作成

signalとkillを実装しました。とりあえず問題なく動いてそうです。 下の画像は何もしない「test」コマンドでプロセスを生成してそのプロセスをkillでSIGKILLシグナル送って殺しているところです。 さて、次何やるかなー

OS作成

signal実装中。例によってpage faultが発生しまくります。とりあえずkillとsignalを実装して後は放置予定です。

OS作成

waitpid実装。昨日のpage faultは_exit()の中でprocessのstateをzombieにした後そのまま返ってしまっていてそのまま何のコードもない0x8048000付近を突っ走ったために起きた現象でした。eshellでwaitpidを使ってコマンドの終了を待たせるようにしたので余計…

OS作成

waitpid実装中。スケジューラ回りをcontext保存部、スケジューリング部に分離し、また親、子、兄弟プロセス関連を整備。exitするとプロセスはZOMBIE状態になるようにしwaitpidをした時、子プロセスにZOMBIE状態のプロセスがあればSTOPPED状態にして次回その…

OS作成

PIT(8254チップ)でどうやってタイマとスケジュール割り込みを共有しているのか謎だったけどコード見て謎が解けた。以下Linux-0.12の該当コード。(このバージョンはいい教材です。僕はLinux 2.6.xxを読んでいて理解不能でつらいときはminixと共にこのバージ…

OS作成

PITを実装(といってもPITレジスタにカウンタ値設定するだけの3行コード)

OS作成

メモリ上のダンプを見たいけどqemu、bochsだとアドレス指定して一覧表示させて見るという方法があるにはあるけど面倒だという事でメモリダンプシステムコールを実装。これで特定プロセスのリニアアドレス上のメモリダンプをserial経由で以下のようにファイル…

OS作成 - シェル編

ユーザランドmallocのコード中にmuse_list(使ったメモリ構造体を連結しておくリストのhead)の操作中にpage fault起こすので調べてました。最初は.bss領域を初期化したのがまずいと思ったのですが。特に0で初期化されてまずい領域もなく、次にリストが空の時…

OS作成 - シェル編

malloc。.bss領域が初期化出来ていない問題はelfloader時にelf program headerのflagsにexecuteのbitが立っていないときに0でmemsetする事で解消。 と思ったけど globalに確保した領域(ここも.bss)まで0に初期化されてしまってうまくいかない。

OS作成 - シェル編

malloc実装中。どうやら.bssセクション領域が変。きっちりpagingされてないのかな。

OS作成 - シェル編

exitシステムコールを実装中にBOUND範囲超過例外(0x05)なるものに初めて遭遇しました。IA-32デベロパーズマニュアルを参照すると BOUND 命令が実行された時点でBOUND 範囲超過フォルトが発生したことを示す。 BOUND 命令は、符号付きの配列インデックスを…

Sodex 0.0.1リリース

Sodexカーネルのリリース第一弾、Sodex version 0.0.1をリリースしました。一応プリエンプティブなマルチタスクカーネルになってます。DLしたらsodex-start.batで起動してください。qemuはwindows用です。Linuxで動かす場合はfsboot.binをLinux用のqemuで起…

OS作成 - シェル編

今日もシェル回りを弄る。ps、pwdコマンドを追加実装しました。cdも実装中ですがcurrent processのcurrent dentry構造体を書き換えるとその後シェルのループが固まってしまいます。cdコマンドが実装出来たら一旦リリースかな。 sodex rev.48

OS作成 - シェル編

色々とカーネル内部を整備しつつcatコマンドを実装。catというよりほとんどシェルの引数argvをどうやって新規プロセスに渡すかという部分をやってました。また、execveといいつつどちらかというとforkのような動きになっているためコマンドを打った直後に先…

OS作成 - シェル編

シェルで引数を渡せるようにしようと思い、ユーザライブラリを整備していたのですが、どうもprintfやらputsを呼ぼうとするとpage faultになってしまう。色々原因を探っていたのですが、最終的に呼ばれるwrite(..)をcallした所でpage faultが発生している模様…

OS作成 - シェル編

永き悠久の時が流れ、ついにsodexカーネルが産声をあげました。今まではカーネル内部をひたすら書いていたのですが、さきほどようやく人類の叡智であるCUIを得ました。まぁlsが動いただけなんですが、、感動度は「OSを作ろう part2」でid:higepon氏がやって…

OS作成 - シェル編

やっちまった。。execve.Sのint 0x80の直後に「1: jmp 1b」入れたの忘れてずっとプロセスの反応が無い事に悩んでた。。。。。しかもわざわざqemuのin_asmログとobjdumpまでやってからやっと気付くという間抜けっぷり 笑うしかないOTL ※現状のsodexのexecveは…

OS作成 - シェル編

1回だけコマンドの入力が可能なシェルを書きました。lsコマンドのみ実装してあります。以前、ファイルシステム実装時に用意してあったext3_ls()をシステムコール経由で実行しているのですが、以前とは違いinitプロセスから簡易シェルプロセス/usr/bin/eshell…