投稿

2月, 2019の投稿を表示しています

MochiOS@仮想ファイルシステムの作成part3

MochiOS@仮想ファイルシステムの作成part3 前提知識無しで作るなんちゃって仮想ファイルシステムpart3。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 %dとか使いたいじゃん? part3では、ログ出力機能も実装して、試してみて、わはーうまく動いてる。って書きたかったんだけど、欲張りな私は、printfみたいに「%d」とかで書式指定して変数の内容をログ出力したいと考えたわけだ。 というわけで、C標準ライブラリのvsnprintf()を実装したい。 何故vsnprintf()かというと、 log( "へんすうのあたい=%d", value ); みたいにログ出力関数の引数を可変長にしたいから。 vsnprintf()の仕様 wikipedia さんによるとこんな規則なんですよ。 %[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子 仕様がよくわからんので、 どっかから拾ってきた 仕様を、英語できないけどがんばって訳してみる。 引数順 ISO/IEC9899:1999には無さそうだし、見なかったことにするよ。 フラグ(flag) Zero or more flags (in any order) that modify the meaning of the conversion specification. 変換指定の意味を修飾する0個以上のフラグ(順不同) フラグ 英語説明 適当翻訳 - The result of the conversion is left-justified within the field. (It is right-justified if...

MochiOS@仮想ファイルシステムの作成part2

MochiOS@仮想ファイルシステムの作成part2 前提知識無しで作るなんちゃって仮想ファイルシステムpart2。 開発日記です。独り言です。 タスク名登録機能 前回、「あれ、仮想ファイルシステムにメッセージ送るにはどうすんのよ?」というわけで、カーネルに機能を追加した。 https://ja.osdn.net/projects/mochi/scm/git/master/commits/891fd7049c315ec439dd52fdd3eaeb780d374e95 タスク名登録(MkTaskNameRegister()) 任意のタスク名を登録。タスク名とタスクIDの関連付けが行える。 タスク名登録解除(MkTaskNameUnregister()) 登録したタスク名とタスクIDの関連付けを解除する。 タスクID取得(MkTaskNameGet()) タスク名に一致するタスクIDを取得する。 試したい 作っただけで動くか確認していないので、試したい。 けど、どう試したものか…。 タスクA mvfs カーネル タスク名登録( "VFS" ) タスクID取得( "VFS" ) タスクID タスクIDをちゃんと 取得できたかを どう確認する…? タスクA mvfs カーネル LinuxやWindowsだったらprintfで出力できるけれど、まだそんな機能は無い。 画面にログを出力するタスクを作る。 いっそシリアルポートにログをたれ流せる様なタスクを作る。 カーネルのデバッグログ出力機能を使う。 メモリにログを書き出して、頑張ってメモリダンプして見る。 成功したら再起動させる。 1、2、3、4は割と面倒だし、5はイケてないなぁ… 画面にログを出力するタスクを作る。 面倒臭いのは確か。 1トレースログ1行で画面に出力していくと最下行に来た時に画面スクロールする機能を作らないといけないし。 でも、これからもトレースログで動作を確認したい事はあるので頑張って作る事にする。幸い、カーネルにも以前OSCで展示用に作っていた端末エミュレータのソースコードもあるので、あまり考えずに切り貼りして作れそう。 とりあえずmlogという...

MochiOS@仮想ファイルシステムの作成part1

MochiOS@仮想ファイルシステムの作成part1 前提知識無しで作るなんちゃって仮想ファイルシステムpart1。 開発日記です。独り言です。 作業リポジトリ とりあえず、仮想ファイルシステムをmvfsと名付けてgithubにリポジトリ作りました。 M ochiの V irtual(仮想)な F ile(ファイル)の S ystem(システム)でmvfs!安易! https://github.com/MasterMochi/mvfs ユースケース mvfsにどんな機能を乗せようかと、ユースケースを考えてみる。 登場人物は、ユーザプロセス、mvfs、ビデオドライバ。 ユーザプロセスは、ビデオドライバによってビデオメモリを抽象化したファイルをopen/write/closeしてこのファイルに書き込む事で、画面に文字を出力する。readは割愛。 mvfsは、ファイルとそのアクセス先が誰なのか(タスクID)を管理する。 VGAドライバは、ファイルをmvfsに登録する。 ちょっとシーケンスを書いてみる。 ユーザプロセス mvfs ビデオドライバ mount( "/vram" ) open( "/vram" ) open( "/vram" ) write() write() vram書込み close() close() unmount( "/vram" ) ユーザプロセス mvfs ビデオドライバ mount このファイルへのopen/(read)/write/closeは私(シーケンスで言うとビデオドライバ)にスルーパスしてくれよ要求。名前はmountでいいのかな、、、まぁいいよね。 open/(read)/write/close 普通のファイル操作機能。先のmountによってファイルパスとタスクIDが関連づいているので、mvfsはこれを使って、ビデオドライバに機能呼出しをスルーパスする。 unmount このファイルを削除してくれ。もうスルーパス要らないよ要求。 よし、これで、ユーザプロセスはVGAドライバプロセスのタスクIDなんか知らなくても、mvfsにファイルパスと機能番号を指定してメッ...

MochiOS@仮想ファイルシステムの作成part0

イメージ
MochiOS@仮想ファイルシステムの作成part0 開発中の自作カーネルであるMochi Kernelは、プロセスを起動したり、プロセス(タスク)間通信ができたり、デバイスI/O操作が出来る様になったりと、ちょっとまだ自由は効かないけれど、簡単なシステムを作れるようになってきた。 以前、試しに、Mochi Kernel上でSLコマンドを無限ループさせるデモを作った。 このデモは、ビデオドライバ、端末エミュレータ、TTY、SLコマンドの4つのプロセスをカーネル上で動かし、プロセス間でメッセージをやり取りする事で、ただ80*25のテキスト画面上にSLを走らせる。 SLコマンド TTY 端末エミュレータ ビデオドライバ 指定行列番号に文字出力 ビデオメモリ書込み loop [ 無限 ] SLコマンド TTY 端末エミュレータ ビデオドライバ いい感じに動いてるけど、実装はかなり汚い。 たまにバグって止まるし。 無理やり実装している事の1つは、メッセージ送信先の指定。 メッセージはタスクIDを指定して送信するが、ビデオドライバや端末エミュレータなどのタスクIDは起動した順番で割り当てられる。 システムを作り上げた私は、起動させる順番を把握しているのでタスクIDは分かっていて、ソースコードにタスクIDを直接記載している。が、これは汎用的でない。 普通、HelloWorld!プログラムを書くのに出力先ドライバのプロセス番号を指定する必要はない。printf(“HelloWorld!\n”)で済む。 linuxはどうやってこれを解決しているかというと、ファイルシステム。 (linuxはマイクロカーネルではないので、厳密にはやらせたい事に違いがあるが。) printfは標準出力に文字列を書いていて、標準出力の実体は、大体、 /dev/pts/0 とかいうファイル。 このファイルに書き込むとファイルシステムがうまい事ビデオドライバに橋渡ししてくれるというわけ。たぶん(かなり説明端折ってる) じゃぁ、ファイルシステムを作って、そのファイルに書き込む事でビデオドライバにメッセージを送ろうそうしよう。 ファイルシステムというと、FAT32やらEXT4やらNTFSやら、色々なファイルシステム用語を思い...