2

Linux 内核使用 SYSCALL_DEFINEn 作为系统调用入口点的名称。我知道它是一个宏,最后被 sys_sycallname() 取代,'n' 是它们采用的参数数量。该约定是否仅用于可读性或任何其他特定目的?

提前致谢。

4

2 回答 2

0

没有。

过去,系统调用不是以这种方式定义的。定义系统调用的新方法,即使用 SYSCALL_DEFINEx() 宏,用于修复安全问题。

例如,以下提交是修复之一:

commit 1a94bc34768e463a93cb3751819709ab0ea80a01
Author: Heiko Carstens <heiko.carstens@de.ibm.com>
Date:   Wed Jan 14 14:13:59 2009 +0100

    [CVE-2009-0029] System call wrapper infrastructure

    From: Martin Schwidefsky <schwidefsky@de.ibm.com>

    By selecting HAVE_SYSCALL_WRAPPERS architectures can activate
    system call wrappers in order to sign extend system call arguments.

    All architectures where the ABI defines that the caller of a function
    has to perform sign extension probably need this.

您可以在CVS 页面中找到有关此问题的更多描述:

s390、powerpc、sparc64 和 mips 64 位平台上的 Linux 内核 2.6.28 和更早版本中的 ABI 要求从用户模式应用程序发送时,64 位寄存器中的 32 位参数经过正确符号扩展,但无法验证这一点,这允许本地用户导致拒绝服务(崩溃)或可能通过精心设计的系统调用获得特权。

于 2013-03-01T10:15:47.787 回答
0

我觉得你的想法是有道理的。

但我也认为进一步阅读 SYSCALL_DEFINEn 代码有助于了解参数在用户空间和内核空间之间传递的方式,以及如何捕获到内核空间。因为这些代码是依赖于 CPU 架构的,尽管基本思想是通用的。

于 2013-02-27T09:37:57.493 回答