Open keigo1216 opened 9 months ago
プロセス間で通信を行う際に使う. 例えば、仮想アドレスを割り当てるサーバーとユーザープロセスの間の処理とか
変数を次のように定義する(本来の実装と多少違うが、意味はだいたい同じ)
dst
src
メッセージ送信のアルゴリズム
BLOCK
同期型プロセス間通信を実装する場合、例えば割り込みの通知を行う場合だけ非同期型のプロセス型通信が必要になる この場合に実装するのが通知IPCで、プロセス構造体のフィールドのビット演算で行う アルゴリズムは次のようになっている
RUN
create_processでidel processも作成していたが、runqueueを導入することから扱いが難しくなるので、CPU固有のマクロを使って実装する
tack_block
プロセスの状態をスリープ状態へ変更する関数
tack_resume
スケジューラのスタックに実行プロセス(実行状態はRUNNABLE)を追加する関数
RUNNABLE
message
必要なフィールドは
type
...
union
send_message
recv_message
notify
IPC
IPC_NOBLOCK
task_createしてからmap_page https://github.com/nuta/microkernel-book/blob/c46c2de86f3c917eefc2b86f2a440b4b80c0fefa/kernel/main.c#L10-L67
task_create
map_page
ビルド時に生成されるbootfs.binファイルが__bootfsマクロに対応しているみたい .binファイルの詳細について調べる
__bootfs
ユーザー空間からプロセスを生成できるようにしたい(プロセス間通信のテストのため)
ページフォルトが発生した時の挙動を何も作ってないので作る
ビルド時に複数のユーザー空間のファイルをリンクさせたい時のやり方の調査(それぞれの関数にmain関数が書いてある)
プロセス間通信の実装
セマフォ
プロセス間通信とは?
プロセス間で通信を行う際に使う. 例えば、仮想アドレスを割り当てるサーバーとユーザープロセスの間の処理とか
実装レベルの解説(同期型プロセス間通信の場合)
変数を次のように定義する(本来の実装と多少違うが、意味はだいたい同じ)
dst
: 送信側のプロセスsrc
: 受信側のプロセスメッセージ送信のアルゴリズム
BLOCK
状態の場合BLOCK
状態の場合と同様な、送信処理を行う通知IPCの実装
同期型プロセス間通信を実装する場合、例えば割り込みの通知を行う場合だけ非同期型のプロセス型通信が必要になる この場合に実装するのが通知IPCで、プロセス構造体のフィールドのビット演算で行う アルゴリズムは次のようになっている
BLOCK
の場合RUN
の場合種類
必要な実装
idel processの扱い
create_processでidel processも作成していたが、runqueueを導入することから扱いが難しくなるので、CPU固有のマクロを使って実装する
tack_block
関数の実装プロセスの状態をスリープ状態へ変更する関数
tack_resume
関数の実装スケジューラのスタックに実行プロセス(実行状態は
RUNNABLE
)を追加する関数プロセス間通信のメッセージのフォーマット(
message
構造体)の定義必要なフィールドは
type
: メッセージの種類src
: メッセージの送信元...
: 実際にデータを記述するフィールド,union
型で実装メッセージ送信関数
send_message
の実装メッセージ受信関数
recv_message
の実装通知IPCの
notify
関数の実装システムコール用の関数
IPC
の実装あとで実装
IPC_NOBLOCK
の追加整理
プロセス(スレッド)の状態
サーバーの実装
kernelのmain関数からVMサーバを作成する
task_create
してからmap_page
https://github.com/nuta/microkernel-book/blob/c46c2de86f3c917eefc2b86f2a440b4b80c0fefa/kernel/main.c#L10-L67他のサーバーの起動
ビルド時に生成されるbootfs.binファイルが
__bootfs
マクロに対応しているみたい .binファイルの詳細について調べる