【问题标题】:How mach trap become syscall?马赫陷阱如何成为系统调用?
【发布时间】:2020-05-06 10:13:38
【问题描述】:

我是 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 个参数的转换是如何发生的?

【问题讨论】:

  • 您好,请考虑接受@Technologeeks 提供的答案,因为它回答了您的问题。

标签: bsd mach xnu


【解决方案1】:

MACH_TRAP 是一个宏,它在 mach_trap_table 中插入一个条目:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2011-11-16
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多