2013-06-20 21 views
8

自分のシステムコールを実装したい。 (下のリンク参照)Linuxカーネルを再コンパイルせずに自分のシステムコールを実装する方法は?

http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/

しかし、新しいシステムコールを追加すると、カーネルのコンパイルが必要です。

Linuxカーネルを再コンパイルせずに私自身のシステムコールを実装する方法は?

答えて

14

できません。

カーネルを再コンパイルしないと、カーネルモジュールをビルドしてロードするだけで、カーネルモジュールは新しいシステムコールを追加できなくなります。

+1

まあ短いと甘いだったという。 – BoBTFish

+1

技術的には、スペースなどの影響を受けて、カーネルモジュールを使用して、独自のシステムコールを既存のシステムコールテーブルにパッチすることができます。しかし、それは厄介で、信頼性が低く、間違いなく良いアイデアではありません。 –

+0

技術的には、IOCTLはシステムコールです。だから、それを使ってデータをラップし、ユーザーとカーネルの土地で話すとき、なぜ新しいシステムコールを追加するのですか? – Ash

3

はい、できます。

要するに、実行中のカーネルにパッチを適用する必要があります。

新しいシステムコールを追加するには、少なくとも2通りの方法があります。

  1. は、のいずれかで、既存のシステムコールテーブル(sys_call_tableia32_sys_call_table)とパッチシステムコールリミットチェック命令(x86版usally cmp)を展開(system_call,ia32_system_allなど)
  2. 既存のシステムコールテーブルをコピーし、必要に応じて展開し、システムコールディスパッチ命令(通常はx86ではcall)にパッチを適用して、テーブルのコピーおよびパッチシステムコール制限チェック指示をポイントします。任意のシステムコールエントリ。

この詳細はanwersを参照してください:

Implementing Linux System Call using LKM

How do 32-bit applications make system calls on 64-bit Linux?

:)

+1

あなたが説明している方法は信じられないほど醜いもので安全ではありません。信じられないほど慎重でなければ、読み込まれたときにマシンがクラッシュする可能性があります。どのような状況でも、私は実動システム上でそれをしたモジュールの使用を検討しません。 – duskwuff

+1

このメソッドに関しては、動作しますが実装は重要です。正しい実装には強いスキルが必要であり、このタスクはサッカーのためではありません:) –

関連する問題