web-dev-qa-db-ja.com

デバイスドライバーのカーネルモジュールのロード時に/ devにデバイスを自動的に作成するにはどうすればよいですか?

Linuxデバイスドライバーを開発しようとしています。最初の試みとして、次のファイルオプションを持つcharデバイスドライバーを開発しようとしています。

struct file_operations fops{  
.open=open_fun,  
.release=release_fun,  
.write=write_fun,  
.read=read_fun,  
};  

insmodを使用してドライバーをロードすると、/proc/devicesがcharデバイスの下にドライバーを一覧表示しているのがわかりますが、/devで見つかりません。 Googleの検索では、mknodを使用して/devにデバイスを作成し、それをドライバーのメジャーとマイナーに関連付けることが提案されました。ただし、これを実行しようとすると、スーパーユーザーとして実行した場合でも「アクセスが拒否されました」というエラーが発生しました。

カーネルモジュールがロードされたときにデバイスを/devに表示するにはどうすればよいですか?古いバージョン(register_chrdev)と新しいバージョン(cdev_init & cdev_add)の両方のデバイスの登録を試しましたが、いずれも機能しません。

ありがとう、
ミール

13
Mir
  • ヘッダーファイルlinux/device.hおよびlinux/kdev_t.h

  • 静的構造体クラスc_dev;

  • static struct dev_t dev;

ドライバーの__init関数内に以下のAPIを追加します

  • cl = class_create(THIS_MODULE、 "x");

ここで、x-ドライバーがロードされたときに/ sys/class /内に表示される名前。

  • Device_create()カーネルAPIをdevice_create(cl、NULL、dev、NULL、 "d");で使用します。

ここで、d-/devの下に作成されるデバイスファイル。

ここで、devは、ドライバーのメジャー番号を動的に割り当てるためのalloc_chrdev_regionAPIの使用中に初期化される最初のデバイス番号の変数です。

詳細については、リンクを参照してください http://opensourceforu.com/2011/04/character-device-files-creation-operations/

7

作成する必要のあるデバイスノードをシステムに通知するには、 いくつかのudevルールを作成する 必要がある場合があります。

3

コンソールで次のコマンドを実行してノードを作成した後、/dev内のエントリを確認できました。

Sudo mknod -m 0666/dev/msio c 22 0

ユーザーはrootではなかったので、Sudoを使用する必要がありました。私のエントリ名はmsioで、メジャー番号とマイナー番号がそれぞれ22、0の文字デバイスです。

これがプログラムで達成できるかどうかをお知らせします。

3
Shash316

CONFIG_DEVTMPFSは、ディストリビューションで使用できるのであれば非常に便利です。起動時にカーネルを自動マウントするか(CONFIG_DEVTMPFS_MOUNT)、手動でマウントする(mount -t devtmpfs none/dev)ことができます。

2
Jamie Iles

最初に使用する必要があります:Sudo mknod/dev/devicename c 81 0

/ devにデバイスファイルを作成しますが、読み取り/書き込み権限を付与する必要があります。そうするには、

Sudo chmod 777/dev/devicename

完了!!!

0
Akash Patel