初歩的な質問かもしれませんが、わかる方教えてください。
キャラクタードライバーに struct cdev を登録する必要があるのはなぜですか?
初歩的な質問かもしれませんが、わかる方教えてください。
キャラクタードライバーに struct cdev を登録する必要があるのはなぜですか?
struct cdev
カーネル内のキャラクター デバイスを表します。
すべてのストリーミング デバイス (例: uart、キーボード) はキャラクター デバイス カテゴリに分類され、デバイス ノード ファイル(例: /dev/ttyS0 ) としてユーザー空間で使用できます。ユーザー アプリケーションは、標準のファイル I/O 操作を使用してデバイスにアクセスします。
カーネル内では、キャラクター ドライバーがデバイス ファイルとストリーミング デバイスの間に入り、このドライバー レイヤーがファイル I/O 操作をデバイス操作に、またはその逆に変換します。
キャラクタ デバイス ドライバの開発struct file_operations
では、最も重要なデータ構造が使用されます。この構造体は、デバイスのopen()、read()、write()、close()、ioctl() などの基本的なファイル i/o 機能を実装するために使用されます。
struct cdev
file_operations
構造体は、構造体とその他の重要なドライバー情報 (メジャー/マイナー番号) をカプセル化します。キャラクタードライバーをカーネルに登録する新しい方法です。
cdev 構造は、次の API を介してカーネルによってアクセスされます。
cdev_init() - used to initialize struct cdev with the defined file_operations
cdev_add() - used to add a character device to the system.
cdev_del() - used to remove a character device from the system
への呼び出し後、cdev_add()
デバイスはすぐに有効になります。(file_operations 構造体を介して) 定義したすべての関数を呼び出すことができます。
あなたの質問について私が理解していることから、あなたは の意味について尋ねているようですstruct cdev
。構造struct cdev
の要素の 1 つです。inode
すでにご存知かもしれませんが、inode
構造体はファイルを表すためにカーネルによって内部的に使用されます。はstruct cdev
、char デバイスを表すカーネルの内部構造です。cdev* i_cdev
そのため、のフィールドはcdevstruct inode
構造体へのポインターであり、inode
は char デバイス ファイルを参照します。したがって、カーネルがキャラクターデバイスを呼び出さなければならない場合、cdev
タイプの構造体を登録する必要があります。