Linux内核系统调用命名约定



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

我认为你的想法是有道理的。

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

在过去,系统调用不是这样定义的。定义系统调用的新方法,即使用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页面中找到有关此问题的更多描述:

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

最新更新