ロード可能なカーネルモジュールを使用してLinux 3.2.xに新しいシステムコールを追加する[終了]


11

Linuxカーネル3.2.xに特定の新しいシステムコールを追加したいが、ロード可能なカーネルモジュールとして(カーネルを何度も再コンパイルしたくないため)

私はインターネットやSOでも多くの投稿を読みましたが、一部の場所では、システムコールをロード可能なモジュールとして実装することは不可能であると主張しています。

どっち?可能な場合はどうすればよいですか?


この質問はここではトピックから外れています。UnixとLinuxはプログラミングではなく使用方法と管理に関するものです。Stack Overflowで質問する必要があります。あいまいにしないでください。StackOverflowで見つけた投稿にリンクし、結論が出ていない、または矛盾していることを説明してください。
Gilles「SO-邪悪なことをやめよう」

2
この質問は、プログラミング自体よりも、OSとしてのLinuxに関連していると思います。また、システムの機能を拡張する可能性とその限界を知ることも非常に重要です。これにより、たとえば、ロード可能なモジュールとして実装できない機能があり、カーネルパッチが必要な理由を理解できます。なぜそれがこのようなものであるかを知ることは、カーネル開発者が作成しなければならないセキュリティ対ユーザビリティのいくつかのアイデアをあなたに与えるかもしれません。OPがそれが可能であるかどうかだけを尋ね、なぜそれを実現するのではなく、どのように実装しないのかについては、その質問はよりトピックになりますか?
Krzysztof Adamski 2012

1
Linuxカーネルメーリングリストでは、多数の<stroke> flames </ stroke>ディスカッションがありました。たとえば、reiserfsは独自のsyscallsを使用しましたが、これはLinusを含む一部のコア開発者にはあまり愛されていませんでした。あなたの場合、私は単にioctl()タスクにsを使用しますが、それらは簡単にモジュール化できます。システムコールの数が非常にハードコーディングされたものであり、誰もそれが全体像に入る混乱を望んでいない可能性があるので、これを困難にする主な理由はAfaikです。しかし、sysfs、ioctlsなど、同じ機能に到達するための多数のカーネルインターフェイスがあります。
peterh-2015年

回答:


14

システムコールテーブル(と呼ばれますsys_call_table)は静的なサイズの配列であるため、これはできません。そして、そのサイズは、登録されたsyscallの数によってコンパイル時に決定されます。これは、別のスペースがないことを意味します。

が定義されているarch/x86/kernel/syscall_64.cファイルで、たとえばx86アーキテクチャの実装を確認できますsys_call_table。そのサイズは正確__NR_syscall_max+1です。__NR_syscall_maxは(最後のsyscallの数です)arch/x86/kernel/asm-offsets_64.cとして定義されsizeof(syscalls) - 1ます。ここsyscallで、はすべてのsyscallを含むテーブルです。

考えられる解決策の1つは、既存の(または、アーキテクチャに存在する場合は廃止されたものsys_setaltrootなど)システムコール番号を再利用することです。これにより、メモリ内により多くのスペースが必要なくなります。一部のアーキテクチャでは、syscallテーブル(64ビットバージョンのx86など)にも穴がある場合があるため、これも使用できます。

新しいsyscallを開発していて、実験中に再起動しないようにしたい場合は、この手法を使用できます。新しいシステムコールを定義し、syscallテーブルで既存のエントリを見つけて、モジュールから置き換える必要があります。

カーネルモジュールからこれを行うのは簡単ではありません。カーネルはsys_call_tableバージョン2.6の時点ではモジュールにエクスポートされないためです(このシンボルがエクスポートされた最後のカーネルバージョンはでした2.5.41)。

これを回避する1つの方法は、sys_call_tableシンボルをモジュールにエクスポートするようにカーネルを変更することです。これを行うには、次の2行を追加する必要がありますkernel/kallsyms.c本番マシンではこれを行わないでください)。

extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);

別の手法は、syscallテーブルを動的に見つけることです。カーネルメモリを反復処理し、各単語を既知のシステムコール関数へのポインターと比較します。テーブル内のこの既知のsyscallのオフセットがわかっているので、テーブルの開始アドレスを計算できます。


1

残念ながら、ロード可能なモジュールとしてシステムコールをカーネルに追加することはできません。新しいシステムコールを追加するたびに、カーネルのコンパイルに苦労する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.