1

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

mach_msg 源代码可以在这里找到,但是像 task_get_special_port 这样的函数特定助手的源代码似乎没有出现在 libsyscall 源代码树的任何地方。那些 kernelFunction-to-machMsg-adapter 在哪里实现或生成?

另外,在消息和内核函数调用之间进行转换的 mach 消息的接收器在哪里实现?(task_get_special_port 的实际内核实现可以在这里找到)

4

1 回答 1

1

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

它们由马赫接口生成器 (MIG) 生成。如果您在内核源代码中查找扩展名为 .defs 的文件,您可以看到 MIG 用于生成的定义。

Apple Docs中声明:

在陷阱级别,大多数 Mach 抽象的接口由发送到和从代表这些对象的内核端口的消息组成。陷阱级接口(例如 mach_msg_overwrite_trap)和消息格式本身在 Mach 接口生成器 (MIG) 的正常使用中被抽象出来。MIG 用于根据这些 API 的描述编译基于消息的 API 的过程接口。

对于,您可以在此处task_get_special_port查看 defs 文件。

如果您对该文件调用 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比手动编写客户端和服务器协议更不容易出错。

于 2016-10-10T09:50:01.537 回答