Linux 内核使用 SYSCALL_DEFINEn 作为系统调用入口点的名称。我知道它是一个宏,最后被 sys_sycallname() 取代,'n' 是它们采用的参数数量。该约定是否仅用于可读性或任何其他特定目的?
提前致谢。
Linux 内核使用 SYSCALL_DEFINEn 作为系统调用入口点的名称。我知道它是一个宏,最后被 sys_sycallname() 取代,'n' 是它们采用的参数数量。该约定是否仅用于可读性或任何其他特定目的?
提前致谢。
没有。
过去,系统调用不是以这种方式定义的。定义系统调用的新方法,即使用 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 位参数经过正确符号扩展,但无法验证这一点,这允许本地用户导致拒绝服务(崩溃)或可能通过精心设计的系统调用获得特权。
我觉得你的想法是有道理的。
但我也认为进一步阅读 SYSCALL_DEFINEn 代码有助于了解参数在用户空间和内核空间之间传递的方式,以及如何捕获到内核空间。因为这些代码是依赖于 CPU 架构的,尽管基本思想是通用的。