mach陷阱如何成为系统调用?

How mach trap become syscall?

我是 XNU 内核的新手,有些困惑。

我看到我们在文件 vm_unix.c:

中有一个函数
kern_return_t  task_for_pid(struct task_for_pid_args *args)

加上评论:

// This should be a BSD system call, not a Mach trap!!!

然后 osfmk\mach 中的 2 个声明:

/*
 *  Obsolete interfaces.
 */

extern kern_return_t task_for_pid(
mach_port_name_t target_tport,
int pid,
mach_port_name_t *t);

extern kern_return_t task_for_pid(
struct task_for_pid_args *args);

并在 kern

中进行陷阱减速
/* 45 */ MACH_TRAP(task_for_pid, 3, 3, munge_www),

如您所见,我找到了 2 个声明和 1 个实现。

3参数匹配陷阱的实现在哪里? 从 3 个参数到 1 个参数的转换是如何发生的?

MACH_TRAP 是一个宏,它在 mach_trap_table:

中插入一个条目

#define MACH_TRAP(名称, arg_count, u32_arg_words, munge32)
{ (arg_count), (kern_return_t (*)(void *)) (名称), (u32_arg_words) }

(参见 http://newosxbook.com/src.jl?tree=xnu&ver=6153.11.26&file=osfmk/kern/syscall_sw.h

然后在 mach 陷阱调用中反序列化参数,方法是让它们通过 mach_call_munger (http://newosxbook.com/src.jl?tree=xnu&ver=6153.11.26&file=osfmk/i386/bsd_i386.c),这是处理 32/64 bit-ness 的包装器,然后将参数传递给实际的处理程序。

来源:“*OS 内幕”(http://NewOSXBook.com/)第一卷