keigo1216 / ketchup

raspberrypi 3A+用のOS
1 stars 0 forks source link

implement IPC system #47

Open keigo1216 opened 9 months ago

keigo1216 commented 9 months ago

プロセス間通信の実装

セマフォ

プロセス間通信とは?

プロセス間で通信を行う際に使う. 例えば、仮想アドレスを割り当てるサーバーとユーザープロセスの間の処理とか

実装レベルの解説(同期型プロセス間通信の場合)

変数を次のように定義する(本来の実装と多少違うが、意味はだいたい同じ)

メッセージ送信のアルゴリズム

  1. 送信側のプロセスが受信側のプロセスの状態を確認する
    • 受信側のプロセスがBLOCK状態の場合
    • 受信先のプロセス構造体のメッセージ格納用のフィールドにメッセージをセットする
    • 受信側のプロセスをコンテキストスイッチで再開する
    • 受信側のプロセスが現在動いている場合
    • 受信側の送信待ちキューに送信側のプロセスを追加し、送信側のプロセスをブロックする. その後、コンテキストスイッチして、別のプロセスへ実行順を譲る
    • コンテキストスイッチをして、いつか受信側プロセスになる(はず)。その際に、送信待ちキューを確認して、そこに送信待ちしてブロックされているプロセスがある場合は、そのプロセスを再開する
    • 再開後の送信側のプロセスで、受信側のプロセスが終了している場合は、送信処理を中断する
    • 受信側のプロセスが生きている場合は、BLOCK状態の場合と同様な、送信処理を行う

通知IPCの実装

同期型プロセス間通信を実装する場合、例えば割り込みの通知を行う場合だけ非同期型のプロセス型通信が必要になる この場合に実装するのが通知IPCで、プロセス構造体のフィールドのビット演算で行う アルゴリズムは次のようになっている

必要な実装

idel processの扱い

create_processでidel processも作成していたが、runqueueを導入することから扱いが難しくなるので、CPU固有のマクロを使って実装する

tack_block関数の実装

プロセスの状態をスリープ状態へ変更する関数

tack_resume関数の実装

スケジューラのスタックに実行プロセス(実行状態はRUNNABLE)を追加する関数

プロセス間通信のメッセージのフォーマット(message構造体)の定義

必要なフィールドは

メッセージ送信関数send_messageの実装

メッセージ受信関数recv_messageの実装

通知IPCのnotify関数の実装

システムコール用の関数IPCの実装

あとで実装

整理

プロセス(スレッド)の状態

サーバーの実装

kernelのmain関数からVMサーバを作成する

task_createしてからmap_page https://github.com/nuta/microkernel-book/blob/c46c2de86f3c917eefc2b86f2a440b4b80c0fefa/kernel/main.c#L10-L67

他のサーバーの起動

ビルド時に生成されるbootfs.binファイルが__bootfsマクロに対応しているみたい .binファイルの詳細について調べる

keigo1216 commented 2 months ago

プロセスを生成するシステムコールの整備

ユーザー空間からプロセスを生成できるようにしたい(プロセス間通信のテストのため)

keigo1216 commented 2 months ago

ユーザー空間でのページフォルトの対応

ページフォルトが発生した時の挙動を何も作ってないので作る

keigo1216 commented 2 months ago

TODO

ビルド時に複数のユーザー空間のファイルをリンクさせたい時のやり方の調査(それぞれの関数にmain関数が書いてある)