Linux カーネルは、syscall エントリ ポイントの名前として SYSCALL_DEFINEn を使用します。これはマクロであり、最終的に sys_sycallname() に置き換えられ、「n」はそれらが取る引数の数であることを理解しています。その規則は、読みやすさまたはその他の特定の目的のためだけに使用されていますか?
前もって感謝します。
Linux カーネルは、syscall エントリ ポイントの名前として SYSCALL_DEFINEn を使用します。これはマクロであり、最終的に sys_sycallname() に置き換えられ、「n」はそれらが取る引数の数であることを理解しています。その規則は、読みやすさまたはその他の特定の目的のためだけに使用されていますか?
前もって感謝します。
いいえ。
以前は、システムコールはこのように定義されていませんでした。システムコールを定義する新しい方法、つまりSYSCALL_DEFINEx()マクロを使用する方法は、セキュリティの問題を修正するためのものです。
たとえば、次のコミットは修正の1つです。
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ビットプラットフォームのABIでは、64ビットレジスタの32ビット引数がユーザーモードアプリケーションから送信されたときに適切に符号拡張されている必要があります。ただし、これを確認することはできません。これにより、ローカルユーザーがサービスの拒否(クラッシュ)を引き起こしたり、巧妙に細工されたシステムコールを介して特権を取得したりする可能性があります。
あなたの考えは合理的だと思います。
しかし、SYSCALL_DEFINEn コードをさらに読んで、ユーザー空間とカーネル空間の間でパラメーターが受け渡される方法と、カーネル空間にトラップする方法を理解することも役立つと思います。基本的な考え方は共通ですが、これらのコードは CPU アーキテクチャに依存するためです。