ファイルを開いて読み取る必要がある Linux カーネル モジュールを作成しています。それを達成するための最良の方法は何ですか?
6 に答える
なぜファイルを開こうとしているのですか?
私は Linux 開発をフォローするのが好きで (好奇心から、私はカーネル開発者ではなく、Java をやっています)、以前にこの質問に関する議論を見たことがあります。これに関するLKML メッセージを見つけることができました。基本的には、通常は悪い考えであると述べています。LWN が昨年それを取り上げたことはほぼ間違いありませんが、記事を見つけるのに苦労しています。
これが非公開モジュールの場合 (一部のカスタム ハードウェアのように、モジュールが配布されない場合)、これを行うことができますが、コードをメインラインに送信する場合はそうではない可能性があるという印象を受けています。受け付けます。
Evan Teran は sysfs について言及しましたが、これは私には良い考えのように思えます。より難しいカスタム作業が本当に必要な場合は、いつでも新しい ioctrl を作成できます。
編集:
OK、探していた記事を見つけました。それはLinux Journalからのものです。この種のことを行うことが一般的に悪い考えである理由を説明し、とにかくそれを行う方法を正確に説明します.
open
//システム コールへの関連する関数ポインタへのポインタを取得できると仮定するread
と、次のclose
ようなことができます。
mm_segment_t fs = get_fs();
set_fs(KERNEL_DS);
fd = (*syscall_open)(file, flags, mode);
if(fd != -1) {
(*syscall_read)(fd, buf, size);
(*syscall_close)(fd);
}
set_fs(fs);
syscall_*
ただし、私が示した " " 関数ポインタを作成する必要があります。もっと良い方法があると確信していますが、これでうまくいくと思います。
/proc ファイルシステムも個人的な使用に適しており、簡単です。
http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773.html
一般的に言えば、カーネルモジュールからファイルを読み書きする必要がある場合は、アーキテクチャ上何か間違ったことをしています。
カーネルモジュールがユーザー空間ヘルパープロセスと通信できるようにするメカニズム (たとえば netlink - または単にキャラクターデバイスを登録する) が存在します。そのユーザー空間ヘルパー プロセスは、必要なことは何でも実行できます。
また、システム コール (など) を実装して、ユーザー空間で開かれたファイル記述子を取得し、カーネルから読み書きすることもできます。
これはおそらく、カーネル空間でファイルを開こうとするよりもうまくいくでしょう。
カーネル空間からすでにファイルを開いているものは他にもいくつかあります。それらを調べることができます (ループ ドライバーが思い浮かびますか?)。
sys_call_open に関する情報は、このLinux Kernel Module Programing Guideにも記載されています。