2016-10-09 4 views
1

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

mach_msgソースはhereですが、task_get_special_portのような機能固有のヘルパーのソースはlibsyscallソースツリーのどこにも表示されません。それらのkernelFunction-to-machMsgアダプタはどこに実装されているか生成されていますか?

また、メッセージとカーネル関数呼び出しの間で変換されるmachメッセージの受信者はどこにありますか? (task_get_special_portの実際のカーネル実装はhereです)

答えて

1

実装または生成されたkernelFunction-to-machMsgアダプタはどこですか?

これらは、Mach Interface Generator(MIG)によって生成されます。カーネルソースで拡張子.defsのファイルを調べると、MIGによって生成された定義が表示されます。

Apple Docs述べると

:トラップレベルで

、最もマッハ抽象化へのインターフェースは、それらのオブジェクトを表すカーネルポートから送信されたメッセージで構成されています。トラップレベルのインタフェース(mach_msg_overwrite_trapなど)とメッセージ形式は、Mach Interface Generator(MIG)によって通常の使用法で抽象化されます。 MIGは、それらのAPIの記述に基づいて、メッセージベースのAPIへの手続き型インタフェースをコンパイルするために使用されます。

task_get_special_portの場合、defsファイルhereが表示されます。

そのファイルでmigを呼び出すと、3つのファイルが生成されます。

  • 送信者の.Cファイル(taskUser.c)
  • 受信機のための.Cファイル(taskServer.c)
  • 送信者と受信者との間の通信のためのプロトコルを定義するヘッダファイル(task.h)

Server.cファイルを調べると、この関数が表示され、task_get_special_portが直接呼び出されます。 migを使用して

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); 
     } 

    ... 
} 

は手動でクライアントとサーバのプロトコルを記述するよりもはるかに少ないエラーが発生しやすくなります。

関連する問題