实现或生成内核函数的mach_msg帮助器在哪里?

时间:2016-10-09 14:25:32

标签: macos darwin mach

使用mach消息进行与mach内核函数的通信。 libsystem_kernel.dylib系统库实现了一个mach_msg(...)辅助函数来发送/接收任意mach消息,但它也包含使用某些内核函数的准备方法,如task_get_special_port(使用相同的函数名)。 通过反汇编lib二进制可以看出这一点。

可以找到mach_msg源here,但是像task_get_special_port这样的特定于函数的助手的源似乎不会出现在libsyscall源树中的任何位置。那些kernelFunction-to-machMsg-adapter实现或生成在哪里?

还实现了mach消息的接收者,它在消息和内核函数调用之间进行转换? (可以找到task_get_special_port的实际内核实现here

1 个答案:

答案 0 :(得分:1)

  

在哪里实现或生成了kernelFunction-to-machMsg-adapter?

它们由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文件here

如果您在该文件上调用mig,它将生成三个文件。

  • 发件人的.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比不必手动编写客户端和服务器协议更不容易出错。

相关问题