Linux内核系统调用命名约定

时间:2013-02-27 06:06:52

标签: linux linux-kernel

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为你的想法是合理的。

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

答案 1 :(得分: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.

您可以在the CVS page中找到有关此问题的更多说明:

  

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