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/)第一卷
我是 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/)第一卷