2

Linux用の動的にロード可能なモジュールとしてキャラクターデバイスドライバーを作成する方法を学んでいます。通常、次の一連の関数呼び出しを使用してデバイスを登録し、下に表示されるデバイス ファイルを作成します/dev/

alloc_chrdev_region(&first, 0, 1, "myclass");
myclass = class_create(THIS_MODULE, "myclass");
device_create(myclass, NULL, first, NULL, "mydevicefile");
cdev_init(&c_dev, &fops);
cdev_add(&c_dev, first, 1);

デバイス ファイルが に表示され/dev/mydevicefile、操作できるようになります。

これにより、 "mydevicefile"の代わりに既存のデバイス ファイル名を渡すとどうなるか疑問に思いました。

device_create(myclass, NULL, first, NULL, "null");

これにより、/dev/null私のキャラクターデバイスファイルに置き換えられました。さらに懸念されるのは、元の/dev/null. 私の偽のnullモジュールを削除しても、これは修正されませんでした。

実際には、私のモジュールが使用するものと同じ名前の既存のデバイス ファイルが存在するべきではありませんが、理論的には別のデバイス ファイルを上書きできるという事実は依然として私を悩ませています。

使用しようとしているデバイス ファイルと同じ名前のデバイス ファイルが既に存在する場合、どうすれば保護できますか?

更新:私が本当に知りたいのは、udevが交換を許可している理由だと思います。

4

3 に答える 3

2

すべてのデバイス ドライバ ( にある/dev) は基本的にファイル タイプです。つまり、デバイス ファイルが既に存在するかどうかを確認する方法は、ファイルが存在するかどうを確認する方法と同じです。1 つの方法は、次を使用することです。

#include <unistd.h>  // for F_OK and access()

...

if( access( "/dev/null", F_OK ) != -1 ) {
    printf("File already exists!\n");
} else {
    printf("File doesn't exist!\n");
    // create new dev here
}

/dev/null 存在するため、「ファイルが存在します!」と表示されます。ここ

于 2013-03-15T13:41:13.337 に答える
1
This resulted in /dev/null being replaced by my character device file

mknod ユーティリティを使用して、新しい NULL デバイス ファイルを作成できます。

sudo mknod -m 0666 /dev/null c 1 3

于 2013-03-15T13:45:07.460 に答える
0

デバイスノードの作成は、通常、ユーザースペース操作によって処理されます。これが:の目的です。からのデータを解釈することによりudev、ユーザースペースディレクトリにデータを入力して処理します。/dev/sysfm

関数に渡される名前は、デバイスに関する他のデータとともにdevice_create表示される、推奨されるデフォルト名にすぎません。sysfmそのデータをどう処理するかを決めるのは、最終的にはユーザースペースユーティリティまたはユーザー次第です。

同じ名前のデバイスに遭遇したときのデフォルトの動作はudev、古いデバイスノードを新しいデバイスノードで上書きすることです。http://marc.info/?l = linux-hotplug&m = 125559736630729

于 2013-03-15T18:25:10.757 に答える