那些 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
比手动编写客户端和服务器协议更不容易出错。