2013-04-05 2 views
7

カーネルシステムでシステムコールを呼び出す必要があるときに、ヘルパーや関連するカーネル関数を呼び出す代わりに、 'syscall'を実行することがあります。私はまだカーネル空間でシステムコールを呼び出すことができますか?もしそうでなければ、私たちはそんなことをやめてしまいます。カーネル空間でシステムコールを呼び出すことはできますか?

私の質問はちょっと奇妙です。

+0

できません。システムコールは、私が知っていたカーネルとユーザランドの間のインタフェースであることがわかっていました( –

+0

)。私たちがやることは、ヘルパーや他の機能を呼び出すことです。私はちょうど私達がそれを作るかどうか不思議です。 – liuyruc

+0

システムコールはおそらくスケジューリングポイントです。カーネル内の任意の場所でその関数を呼び出すことは望ましくありません。一般に、カーネルコーディングは非常に難しいです。あなたは何を、なぜそれをしたいのかをもっと説明する必要があります。 –

答えて

9

実際には、人気の信念(とここではいくつかの答え)に反して、答えはイエス、あなたがすることができますが、どのOSに応じて、次のとおりです。Linuxので

  • 、あなたがあれば、ほぼすべてのシステムコールを呼び出すことができますカーネルのエクスポートを見つけることができます(例として、 "cat/proc/kallsysms | grep sys_"を実行してください)。データセグメント(KERNEL_DS)を設定することで、ほとんどのシステムコール(ユーザモード*を受け入れるシステム)の保護を回避するための小さな "トリック"があります。正確には推奨されていませんが、カーネル(SELinuxなど)からファイルにアクセスする必要がある場合は確かに意味があります。

  • Windowsでは、カーネル内のNt *呼び出しの大半は、Zw *呼び出しとしても利用できます.Dumpbin/exports C:¥windows¥system32¥ntoskrnl.exe | findstr Zw(またはNt)例。

  • Mac OS Xでは、技術的に許可してはいけませんが、巧妙なハックがあります。しかし、警告を慎重に遵守を通じて - システムコールが実際にユーザーモードとカーネル間のインタフェースです

にもかかわらず、でも生産に値するコードがそう驚くほどかなりの数の場合があります。

+1

しかし、insmodを実行すると、 "Unknown symbol sys_socket"という文が出ます。 –

+0

シンボルがGPLのみである可能性があります。 Linuxはいつかそのようなものです。 cat/grepを上から試してください。シンボルがエクスポートされた(T)が表示されていてもそれにリンクすることができない場合は、その可能性があります。すべてのシステムコールが必ずしもエクスポートされるわけではありません。特にソケットの場合は、他にも問題がありますが、複雑にしないでください - 最初に試してみてください – Technologeeks

関連する問題