これらの kernelFunction-to-machMsg-adapters はどこで実装または生成されますか?
それらは Mach Interface Generator (MIG) によって生成されます。拡張子が .defs のファイルのカーネル ソースを調べると、MIG による生成に使用される定義を確認できます。
Apple Docsに記載されています:
トラップ レベルでは、ほとんどの Mach 抽象化へのインターフェイスは、それらのオブジェクトを表すカーネル ポートとの間で送受信されるメッセージで構成されます。トラップ レベルのインターフェイス (mach_msg_overwrite_trap など) とメッセージ フォーマット自体は、通常の使用では Mach Interface Generator (MIG) によって抽象化されます。MIG は、API の説明に基づいて、メッセージ ベースの API への手続き型インターフェイスをコンパイルするために使用されます。
の場合、ここtask_get_special_port
で defs ファイルを確認できます。
そのファイルに対して mi を呼び出すと、3 つのファイルが生成されます。
- 送信者用の .c ファイル (taskUser.c)
- 受信側の .c ファイル (taskServer.c)
- 送信側と受信側の間の通信プロトコルを定義するヘッダー ファイル (task.h)
Server.c ファイルを調べると、この関数が を直接呼び出していることがわかりますtask_get_special_port
。
mig_internal novalue _Xtask_get_special_port
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
{
...
RetCode = task_get_special_port(In0P->Head.msgh_request_port, In0P->which_port, &OutP->special_port.name);
if (RetCode != KERN_SUCCESS) {
MIG_RETURN_ERROR(OutP, RetCode);
}
...
}
を使用するmig
と、クライアント プロトコルとサーバー プロトコルを手動で作成するよりもエラーが発生しにくくなります。