4

私はLinuxカーネル用のキャラクターデバイスモジュールを書くことをいじっていましたが、少し混乱しました。

オンラインでは、ioctl()コマンド/データをユーザープログラムからカーネルスペースに、またはその逆に転送するために使用するという話があります。しかし、それの多くは、すでに可能であることを行うのはやり過ぎのようですfile_operations struct

// structure containing callbacks
static struct file_operations fops = 
{
    .read = dev_read, // address of dev_read
    .open = dev_open,  // address of dev_open
    .write = dev_write, // address of dev_write 
    .release = dev_rls, // address of dev_rls
};

ioctl()で定義された関数を使用する代わりに、dev_read()およびを使用してユーザーランドとdev_write()の間でデータのチャンクをコピーするだけで使用することには、どのような利点がありますか?copy_to_user()copy_from_user()

4

1 に答える 1

6

ioctlカーネルでデフォルトで提供されていない操作にのみ使用する必要があります。

ioctlデバイスにデータを読み書きするために呼び出さなければならないことは、単純なreadorwrite呼び出しを使用するときの使いやすさの多くを奪います。

非標準操作とは、ターミナル デバイス ドライバーでの自動 ASCII/EBCDIC 変換の設定、DVD ブロック デバイスからのディスクの取り出し、シリアル通信デバイスのシリアル通信パラメーター (ボー レート、ストップ ビットなど) の変更などを意味します。 .

ioctlデバイスドライバにコマンドを転送する (またはデバイスドライバから現在のパラメータや統計情報などのデータ以外の情報を取得する)ために必ず使用してください (代わりにAT、モデムのコマンドセットのようなデータで複雑なエスケープスキームを使用するか、または (これは私の年齢を示しています) はCTRL-D、Apple ][ ディスク サブシステム用です。

データ転送は標準通話にお任せください。

于 2012-12-12T01:30:06.793 に答える