2016-08-17 4 views
0

デバイスドライバを書くときは、device_create()関数を使用します。この関数は、fopsによって登録された関数にリンクされた/ devにファイルを作成します。プログラム内からファイルアクセス権を変更できますか?

このモジュールをinsmodにすると、/ devファイルに書き込むためにfprintfを実行できなくなるという問題があります。ページ・ドメイン・フォルトが発生します。私はまだ普通のファイルに書き込むことができるので、私は/ devのファイルに書き込む許可がないと思います。 device_create()を呼び出している間にカーネルモジュール内でファイルを書き込み可能に設定するために何かできることはありますか?外部で設定する必要はありませんか?

答えて

1

私はこの権利を読んでいれば、あなたがバックアップしたデバイスファイルでfopen +あなたのカスタムドライバ。使用時に、カーネルがクラッシュします。

最初に、FILE抽象化(fopenとfprintfで指定)の使用は、デバイスドライバに適用すると非常に簡単です。内部バッファリングを行うので、実際にどのデータが実際にドライバにヒットするのか、どのくらいのチャンクになるのかはわかりません。代わりに標準のファイル記述子を直接使用してください(open + write)。

今、許可の問題があるという疑惑は正しいものではありません。ドライバのオープンルーチンに達すると、カーネルは必要な特権をすでに持っていると判断しました。同様に、書き込みルーチンに達すると、そのファイルはすでに開かれているので、そのファイルを使用する権限があることがわかります。しかし、何らかのパーミッションの問題があっても、ページ・ドメインの障害は、カーネルが応答で遭遇することは間違いなく有効です。

質問の質を考えれば、私はあなたがこのようなもので遊ぶためにプログラミングが新しく、当面はユーザー空間に固執することを推奨すると主張します。

+0

私は、人々に何かを試して勉強しないように言うという考え方に特に同意しませんが、答えに感謝します。 – Zephyr

+0

私はあなたに「物事を学ばない」と言っているわけではありません。私はあなたに正しい順序で学ぶように言います。ユーザー空間プログラムは書きやすく、デバッグが簡単です。この段階でカーネルで遊ぶことで、あなたはあなたの道を不必要に難しくしています。 –

0

init/initramfs.cを見てください。ここでは、カーネルによってsyscallsのサンプルが使用されています。 linux/syscalls.hを含めて、sys_chmodを使用してください。これはuserspaceの亜種のように機能します。これはほぼすべてのシステムコールに適用することができます(socketをカーネルで使用することは良い考えではありません)

+0

私は決してカーネルドライバを書いていないので、これが良い解決策であるかどうかはわかりませんでしたが、問題はないようです。私の主な問題は、その詳細の欠如です。詳細については、ソースコードを参照するのが適切ですが、そこにあるものの概要を少なくとも提供する必要があります。 –

関連する問題