使用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)
答案 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,它将生成三个文件。
检查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
比不必手动编写客户端和服务器协议更不容易出错。