3

lkmpgからchardev.c の例をコンパイルして実行したところ、デバイスへの書き込み時に予期しないエラーが発生しました。

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied

モジュール書き込み関数は次のようになります。

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/chardev 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
    return -EINVAL;
}

無効な操作の予想されるエラーが発生せず、エラーが /var/log/messages に出力されます。

問題なくデバイスから読み取ることができ、期待される結果を受け取ります。

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!

デバイス /dev/chardev は、次を使用して手動で作成されます。

sudo mknod /dev/chardev c 252 0

どうしたんだ?

- 編集 -

どうやら、デバイスを作成するために mknod すると、最終的に次の権限が付与されます。

crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev. 

私がやっsudo chmod a+w /dev/chardevた後、ドライバーは期待どおりに動作しました。

しかし、人々はこれを行うのは正しくないと言っています。

正しい行動方針とその理由は何ですか?

4

2 に答える 2

5

キャラクタードライバーを実装する方法の本当に、本当に、本当に簡単で単純な例は、drivers/watchdog/softdog.c

コードをこの例と比較すると、次のことを行う方法が示されます。

  • デバイスから読み取る
  • デバイスへの書き込み
  • デバイス経由で ioctl インターフェースを提示する

softdog は非常に便利なツールですが、他の何よりもチュートリアルです。Alan Cox がまとめたので、より「適切な」実装の良い例です。

ソース全体をモジュールに投稿できる場合は、関数が期待どおりに入力されない理由を見つけるのに役立ちます。

アップデート:

特権ユーザーの下でキャラクターデバイスへの書き込みを許可することはまったく問題ありません! 繰り返しますが、権限のないユーザーがキャラクター デバイスに書き込むことを許可することはまったく問題ありません。そうでない場合、FUSE、モデム、USB ガジェット、CD ROM などを使用するにはルート アクセスが必要になります。

あなたができることは、グループメンバーシップを利用することです. つまり、Ubuntu では、FUSE (ユーザー空間内のファイル システム) の使用を許可されたユーザーは、その機能を使用できるユーザーと使用できないユーザーに関する詳細なアクセスを許可する「fuse」グループに属している必要があります。同様に、私のシステムのいくつかでは、QRNG (量子乱数発生器) が使用されており、(ご想像のとおり) キャラクター デバイスです。PHP がその device にアクセスできるようにする必要があるため、次のようにします。

  • QRNG グループを作成する
  • PHP がユーザーとして実行されていることを確認します (匿名のシステム ユーザーではありません)。
  • デバイスへのアクセスが必要なアプリを所有するユーザーを QRNG グループに追加します

それが解決することを願っています:)

于 2009-10-31T01:57:28.607 に答える
4

I think, actual problem is the command which you issued to write is incorrect. Try

#sudo sh -c "echo "hi" > /dev/chardev"

If you want to run multiple commands with sudo then you should use command as shown above. With this, you dont need to do chmod and change its permissions as well. Hope this helps.

于 2009-10-30T11:34:09.833 に答える