投稿

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

イメージ
MochiOS@仮想ファイルシステムの作成part9 前提知識無しで作るなんちゃって仮想ファイルシステムpart9。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 5 mount機能を実装した。たぶんできてる。 6 FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。 7 openと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にwrite機能を実装できちゃった。 8 writeと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にread機能を実装できちゃった。 closeの仕様を考える 今回はclose機能を作ります。 仮想ファイルサーバとしては、openもwriteもreadもcloseもあんまりやること変わらないハズ。なので簡単にできるかな~と思っている。 あ、キャッシュなんて何にも考えていませんからね。 (ブログ記事までreadのコピペ) ユーザタスク mvfs シリアルポートドライバ ローカルFD-> グローバルFD変換 close要求( グローバルFD ) グローバルFD テーブル参照 vfsClose要求( グローバルFD ) vfsClose応答( グローバルFD, 処理結果 ) グローバルFD解放 close応答( 処理結果 ) ローカルFD解放 ユーザタスク mvfs シリアルポートドライバ シーケンスの順番は何も変わらず、渡すデータとちょっと...

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

イメージ
MochiOS@仮想ファイルシステムの作成part7 前提知識無しで作るなんちゃって仮想ファイルシステムpart7。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 5 mount機能を実装した。たぶんできてる。 6 FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。 writeの仕様を考える 今回はwrite機能を作ります。 仮想ファイルサーバとしては、openもwriteもあんまりやること変わらないハズ。なので簡単にできるかな~と思っている。 あ、キャッシュなんて何にも考えていませんからね。 ユーザタスク mvfs シリアルポートドライバ ローカルFD テーブル参照 write要求( グローバルFD, アドレス, データ, データサイズ ) グローバルFD テーブル参照 vfsWrite要求( グローバルFD, アドレス, データ, データサイズ ) デバイス書込み vfsWrite応答 write応答 書込みアドレス更新 ユーザタスク mvfs シリアルポートドライバ シーケンスの順番は何も変わらず、渡すデータとちょっと間にやる事が変わったくらい。 (こうやってシーケンスにしてみると良く分かるのだけど、データのコピー回数の多さ。マイクロカーネルだとメッセージパッシングが主なデータのやり取りとなる(?)わけだけど、4回のデータコピー(ユーザタスク→カーネル→mvfs→カーネル→シリアルポートドライバ)が走るので性能...

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

イメージ
MochiOS@仮想ファイルシステムの作成part8 前提知識無しで作るなんちゃって仮想ファイルシステムpart8。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 5 mount機能を実装した。たぶんできてる。 6 FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。 7 openと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にwrite機能を実装できちゃった。 readの仕様を考える 今回はread機能を作ります。 仮想ファイルサーバとしては、openもwriteもreadもあんまりやること変わらないハズ。なので簡単にできるかな~と思っている。 あ、キャッシュなんて何にも考えていませんからね。 (ブログ記事までwriteのコピペ) ユーザタスク mvfs シリアルポートドライバ ローカルFD テーブル参照 read要求( グローバルFD, アドレス, データサイズ ) グローバルFD テーブル参照 vfsRead要求( グローバルFD, アドレス, データサイズ ) デバイス読み込み vfsRead応答( グローバルFD, 処理結果, データ, データサイズ ) read応答( 処理結果, データ, データサイズ ) 読込みアドレス更新 ユーザタスク mvfs シリアルポートドライバ シーケンスの順番は何も変わらず、渡すデータとちょっと間にやる事が変わったくらい。 以下、メッセージ仕様。...

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

イメージ
MochiOS@仮想ファイルシステムの作成part6 前提知識無しで作るなんちゃって仮想ファイルシステムpart6。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 5 mount()機能を実装した。たぶんできてる。 openの仕様を考える とりあえず、必要なのはパスよね。 あと、読書きフラグ。。。あるけど、今は忘れよ、うん。後ね後。 で、openしたらファイルディスクリプタ(FD)を払い出す。大体、FDはプロセス毎に1からなので、プロセス毎にFDを払い出す事にする。 あー、MochiKernelのメッセージパッシングはメッセージ送信元タスクIDしか取れないので、プロセスIDを取れるようにしないとだ。。 (どこかでMochiKernelの概要を書かねばと思っているのだけど、ここでさらっとご紹介。MochiKernelではカーネル上の1つのコンテキストをタスクという名前で扱う。つまるところ、タスクはスレッドと同じ意味。プロセスは複数のスレッド(タスク)から構成されるのは普通と一緒。スレッドIDはプロセス内ローカル値だがタスクIDはグローバル値という違いがある) mountされたファイルをopenした時、そのファイルをmountしたドライバはopenされたタイミングで何か初期化をしたいかもしれない。 なので、openメッセージを横流しする。横流しといってもメッセージはそのままでなくて、新しい識別子を切ることとしよう。 パラメータはopenしてきたPIDと払い出されたFDを組み合わせた値とパスとしとく。 ユー...

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

イメージ
MochiOS@仮想ファイルシステムの作成part5 前提知識無しで作るなんちゃって仮想ファイルシステムpart5。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 4 ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 共通メッセージフォーマットを決める ようやっとタイトルに相応しい内容が書ける。メッセージフォーマットを決めます。 まぁ、mvfsライブラリでその他のプロセスにはメッセージを隠蔽するので適当に作ればいいのだけれど、設計して書き残しておかないと忘れちゃうよね~。 とりあえず、以下のようなフォーマットとしておく。 offset size 内容 0x00 4 機能ID 0x04 4 タイプ(要求/応答) 0x0c 可変 機能ID毎のデータ ただ、このフォーマットだと後々に色々と問題が出てくる。要求と応答メッセージの対応が分からない、とか。一旦リリースした後に改変したくなった時にバージョン違いとの互換性をどうするか、とか。 でも、今は考えない。困ったら考えよう。行動力第一。 以下、機能IDとタイプの値を決めておく。 機能ID 意味 0x0000_0000 mount 0x0000_0001 open 0x0000_0002 read 0x0000_0003 write 0x0000_0004 close 0x0000_0005 unmount タイプ 意味 備考 0x0000_0000 要求 mvfsへのメッセージ ...

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

イメージ
MochiOS@仮想ファイルシステムの作成part4 前提知識無しで作るなんちゃって仮想ファイルシステムpart4。 開発日記です。独り言です。 これまでのあらすじ part 内容 0 仮想ファイルシステムを作りたい宣言をする。 1 ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 2 カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 3 ログ出力の為に使うvsnprintf()の仕様を調べる。 とりあえず確認できた。 vsnprintf()の仕様調査や実装方法、リアルのお仕事の多忙さやハワイ旅行などで苦戦しつつ、漸くタスク名「LOG」からタスクIDを取得し、そのタスクIDへログ出力メッセージを送信する事ができた。 ちょっと洒落てmlog起動時にロゴを出している。 基本的な動きは以下の通り。 mvfs mlog カーネル 物理メモリ領域割当( VRAMアドレス ) 仮想アドレス タスク名登録( "LOG" ) mlogロゴ画面出力 タスクID取得( "LOG" ) タスクID ログ出力( "main.c:115 mvfs start!" )※ ログ画面出力 mvfs mlog カーネル ※ファイル名main.cと行数115はvsnprintf()により書式変換している。 仮想ファイルシステム開発に戻る 思い起こすと、私は仮想ファイルシステムの開発をしようとしていて、part1でこんなシーケンスを考えていた。 (ビデオは一旦ログ出力で占有する事にしたので、シーケンスの登場人物ビデオドライバをシリアルポートドライバに変更した) ユーザプロセス mvfs シリアルポートドライバ mount( "/serial" ) open( "/serial" ) open( "/serial" ) read() re...