1

mach カーネル関数との通信は、mach メッセージを使用して行われます。libsystem_kernel.dylib システム ライブラリは、任意の mach メッセージを送受信するための mach_msg(...) ヘルパー関数を実装しますが、task_get_special_port などの特定のカーネル関数を使用するためのメソッドも用意されています (同じ関数名で実行されます)。これは、lib バイナリを逆アセンブルすることで確認できます。

mach_msg のソースはここにありますが、task_get_special_port のような関数固有のヘルパーのソースは、libsyscall ソース ツリーのどこにも表示されないようです。これらの kernelFunction-to-machMsg-adapters はどこで実装または生成されますか?

また、メッセージとカーネル関数呼び出しの間で変換するマッハ メッセージのレシーバーはどこに実装されていますか? (task_get_special_port の実際のカーネル実装は、ここで見つけることができます)

4

1 に答える 1

1

これらの 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と、クライアント プロトコルとサーバー プロトコルを手動で作成するよりもエラーが発生しにくくなります。

于 2016-10-10T09:50:01.537 に答える