Linux内核使用SYSCALL_DEFINEn作为syscall入口点的名称。我知道它是一个宏,最后被sys_sycallname()取代,'n'是它们所取的参数个数。该惯例仅用于可读性或其他特定目的吗?Linux内核系统调用命名约定
在此先感谢。
Linux内核使用SYSCALL_DEFINEn作为syscall入口点的名称。我知道它是一个宏,最后被sys_sycallname()取代,'n'是它们所取的参数个数。该惯例仅用于可读性或其他特定目的吗?Linux内核系统调用命名约定
在此先感谢。
我认为你的想法是合理的。
但我还认为进一步阅读SYSCALL_DEFINEn代码以了解参数在用户空间和内核空间之间传递的方式以及如何捕获到内核空间是有帮助的。由于这些代码与CPU架构相关,尽管基本思想很常见。
没有。
在过去,系统调用不是以这种方式定义的。定义系统调用的新方法,即使用SYSCALL_DEFINEx()宏来解决安全问题。
例如下面的提交是修复一个:
commit 1a94bc34768e463a93cb3751819709ab0ea80a01
Author: Heiko Carstens <[email protected]>
Date: Wed Jan 14 14:13:59 2009 +0100
[CVE-2009-0029] System call wrapper infrastructure
From: Martin Schwidefsky <[email protected]>
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更多的描述:
的ABI在Linux内核2.6.28及更早版本上s390,powerpc, sparc64和mips 64位平台要求在 64位寄存器中的32位参数在从 用户模式应用程序发送时正确签名扩展,但无法验证此情况,其中allo本地 用户通过制作的系统调用导致拒绝服务(崩溃)或可能获得特权 。
查看Linux内核源代码的include/linux/syscalls.h – 2013-02-27 06:26:18