Linux内核使用SYSCALL_DEFINEn作为syscall入口点的名称。我知道它是一个宏,最后被sys_sycallname()取代,'n'是它们所采用的参数数量。该惯例是否仅用于可读性或任何其他特定目的?
提前致谢。
答案 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位寄存器正确地符号扩展 用户模式应用程序,但无法验证这一点,这允许本地 用户导致拒绝服务(崩溃)或可能获得权限 通过精心设计的系统调用。