ウォンツテック

そでやまのーと

sodex

OS作成

ファイルシステムも大体出来てきたので次(か次の次)の目標であるloaderの解説書をぽちっと購入。わくわく。 loaderはelf形式かな〜と漠然と考え中(まだ何もわかってない)Linkers & LoadersJohn R. Levine 榊原 一矢 ポジティブエッジ オーム社 2001-09売…

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

新規ファイル作成機能、 書き込み機能実装 また、カーネル内ファイルシステムAPI実装のため各所を大幅に書き換え。 1. メモリ管理回り 今まではMemHole構造体のポインタをメモリallocする側に渡していたが、それを止めvoid*ポインタを返すように変更した。メ…

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

openとreadを実装。インタフェースはPOSIX準拠だけど中身は独自で書きました。openの引数でファイルorディレクトリへのフルパスを指定して、存在すれば(今のところファイルフラグは無視)そのファイルのdentry(inodeをメンバに持つ)をディスクから読み取っ…

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

kmkfs.cppツールでext3フォーマット化したsodexカーネルをカーネル内部で解析してdirectoryのファイル名一覧を表示させる事が出来ました。とりあえずinode番号が「2」であるroot directoryのファイル名等をext3_direntry構造体に入れてそれをリストで繋げた…

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

FDCでファイルシステム上のinode block(4096x4バイト分)を読み込んでいる途中にqemuが止まってしまうので何でかなとregisterを見てみるとespが0x5になってたりする。スタック使い過ぎの関数はどこだ。。

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

自作FileSystem作成ツールkmkfs.cppで作ったFSをLinux上でマウントし、ファイルを読み込むことに成功。まだパラメータで調整する必要がある箇所が残っているため書き込みは出来ず。 今回の作業はいつにもまして泥臭い。。以下の作業の繰り返しを延々とやるだ…

OSを作ろう - ファイルシステム編

Linuxカーネルとmke2fsのソース(http://e2fsprogs.sourceforge.net/)を読みながらsodexのファイルシステム作成toolを修正中。inodeの0番目と1番目にはデータを入れるとまずそうなのでbootm.oとkernel.binはinode 3,4辺りに移行予定。 super blockとgroup de…

OSを作ろう - ファイルシステム編

ファイルシステムの勉強のためLinux本のVFS回りを読んでいるんですが、ext3ファイルシステムのフォーマットをFD上に作っていた時に疑問だった「どうやってカーネルはルートディレクトリを識別するのだろう」という疑問が晴れません。でもよくよく本を読むと…

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

Sodex rev.10middleブート(セカンドブート)とカーネルをext3fsフォーマットに合わせて設置するためのmkfsツールを作成(toolsディレクトリ以下)。それに伴い、makefileとbootacient.Sを修正。 bootacient.S(ファーストブート)とbootmiddle.S(セカンドブー…

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

FD上のマップをどうしようかと悩み中。 いろいろ調べてみるとLinuxのレスキューディスクのように1枚のFDにカーネルとファイルシステムを入れる場合、vmlinuz(kernel)とinitrd(FS)を別々のファイルとして用意し、GRUBやLILOのようなブートローダーがそのディ…

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

一通り読んだけど具体的な実装回りになると今一分からなくなっててきたのでとりあえずFD限定で考えてみる。 Ext3 レイアウト 一つのパーティションをブロックグループという単位で管理するが、FDの場合は容量が少ないので1つで十分 ブロックグループは複数の…

OS作成

MINIX本と詳解LINUXカーネルとLINUXカーネル読解室でファイルシステムの勉強中。予定としてはExt3を実装してみようかと思ってます。当然全部いきなりやろうとすると挫折するのでまずはREAD,WRITEシステムコールの実装を目的とした必要最低限の機能を書いてみ…

OS作成

TSSを使わないタスクスイッチを実装 Intel CPUが持っているタスクスイッチ機能を使わずにスイッチ部分を実装。TSSのスイッチ時に大分悩んだので結構すんなり出来たかな。 今回定義した各タスクの状態は // Light TSS typedef struct _LTSS { u_int32_t eip; …

OS作成

serialドライバー とりあえず出力だけ作成(といっても出力だけだと割り込みも発生してないのでデータレジスタ0x3F8に文字を出力させるだけ)。 一応vga.cと同じようなprint出力を用意Sodex rev.7qemuでserial出力を確認する場合はコマンドラインで qemu -fd…

OS作成

リファクタリングしようとソースをいじってたらFDCでrecalibrateの後に割り込みがこなくなった。。。最初のDORのFDCリセットに対する割り込みは来るんだけどその後にrecalibrateしようとするとこない。当然割り込みhandlerで0x20 I/OポートのOCW2レジスタに…

OS作成

タスクスイッチを進める前に箱物機器には欠かせないシリアル入出力のドライバを無性に書きたくなったので事前に必要な情報をメモ。 前提 ・現在コントローラはNS16550相当の物が使われている。※UARTと呼ばれている ・I/OポートはCOM1〜COM4でそれぞれ以下の…

OS作成

諸悪の根源を突き止めた。 タスクスイッチから帰ってくるljmp命令直後(セグメント間命令によりタスクスイッチし、再び自分にスイッチした時に戻ってくる)にpopをするとその値が壊れている。メモリダンプでその時のesp付近のメモリを丹念に調べてみると完全…

OS作成

bochsで正常に動作しない原因は判明した。 GDTの設定時の(((type >> 8)&0xf) 演算子の優先順位を間違えていたためGDTの中身が微妙におかしくなっていた(今まではたまたま必須なビットが立っていたりしたためそれほどの誤動作はせずに動いていた模様)。これ…

コンパイルオプションで付けたbochsのdebug機能、素晴らしい。。gdbに近いことが出来る。 break pointの挿入はvirtual address, linear address, phisical addressどれでも出来るし。(関数名での挿入はさすがに出来ないかな?調べてないけど) というよりqe…

OS作成

qemuと実機だけの開発環境だと実験が主にqemuの実装に依存してしまうのでbochs(Linux版)も入れてみた。bochs用のBIOSやらは/usr/share/bochsにインストールされているので以下のようにbochs用コンフィグを書いた。(windows用のコンフィグをコピー) romim…

OS作成

kernelでprocess1()関数を呼び出して無限ループさせておいてからPICの割り込みによってタスクスイッチをさせる時、process2→process3→process1の移行の部分がhangする問題でTSSの中身を見てみた。 おそらく正しい値が入っているんだけど、実際に2回目のproce…

OS作成

Sodex rev4 ソース Intel CPUのTSSを使用したSodexのマルチタスク化に成功。 無限ループするprocess2,process3関数を用意してそれをひとつのタスクとしてTSSにセットしそれらをPICのタイマー割り込みが入ったときに交互に呼び出す。本当は元のkernelをproces…

OS作成

CPUのTSS機能を利用したタスク切り替えの考察 Kernelがタスク切り替えをした時、再びそのタスクに戻れるように現在のタスク情報をメモリに保存してから切り替える必要があるが、その保存情報がTSSである。このTSSのフォーマットはCPUにより決められており以…

OS作成

次の目標はプロセス制御(タスク制御)回り。 いきなり全て書くのは無理なので次の小目標を経ていこうかと思案中。1. Intel CPUのTSSを使用したタスク切り替え 2. CPUが持つ機能を使用しないタスク切り替え ※大半のOSがこっち。理由はこっちの方が軽いから 3.…

OS作成

今後デバッグがし易いようにvga.cでprintfモドキなAPIを実装。 可変長変数用マクロ定義のためstdarg.hも実装 stdarg.h #ifndef _STDARG_H #define _STDARG_H #include "types.h" typedef char* va_list; #define __va_size(x) (sizeof(x) > sizeof(int32_t) …

OS作成

読み込みに続いてqemu&実機でのFDC seekと書き込みに成功。 これはdmaの転送方向を変えるのとseekとwrite用コマンドを書くだけでいいのですぐ出来た。 とりあえず直近の目標の一つであるFDCの1セクタ読み書きが出来た。複数セクタ読み書きはこれを適当にwrap…

OS作成

FDCの実機での1セクタ読み込みに成功。 苦労した点としては どのくらいwaitすればFDCがbusyからready状態になるのか どのコマンド操作をした時にFDCからCPUに割り込みが入るのか FDCの割り込みマスク解除を忘れていた FDCの割り込みhandlerで次の割り込み待…

OS作成

Qemuでfloppyの1セクタのreadに成功。 しかし、石叩きはむずかしい、というか資料が少ない。必要な情報としては 初期化 読み込む手順 が欲しいんだけどデータシートとか「パソコンのレガシィI/O活用大全isbn:9784789834339」には石の中のレジスタの詳細しか…

OSを作る

メモリ管理の実装大体完了。マクロを使って以前のよりすっきり書いた(つもり。。) メモリ管理も書いたし、次は頓挫してたFDCドライバーかな。 とりあえず1セクタの読み書きを目指そう。 memory.h #ifndef _MEMORY_H #define _MEMORY_H #include "types.h"…

OS

FDの読み込みを汎用的にして64KB以上に対応。 addw $0x1000, %ax とやらなければならない所を addw 0x1000, %ax とやってて気づくのに2時間くらい掛かったorz.. /* * @File bootacient.S * @Brief The initial boot section of Sodex * * @Author Sodex * @R…