「ファイルを開く」操作を含む単純なcharデバイスドライバー(mydev)を作成しました。
ユーザースペースアプリケーションで、このドライバーノードを開きます。open( "/ dev / mydev"、O_RDONLY);を使用します。open()システムコールは、内部でsys_open()を呼び出します。
sys_open()関数がドライバーのファイルを開く操作を呼び出す方法について知りたいだけです。VFSがこれを処理する方法。これは、VFSが内部で呼び出す関数です。
「ファイルを開く」操作を含む単純なcharデバイスドライバー(mydev)を作成しました。
ユーザースペースアプリケーションで、このドライバーノードを開きます。open( "/ dev / mydev"、O_RDONLY);を使用します。open()システムコールは、内部でsys_open()を呼び出します。
sys_open()関数がドライバーのファイルを開く操作を呼び出す方法について知りたいだけです。VFSがこれを処理する方法。これは、VFSが内部で呼び出す関数です。
セクション12.5.1のUnderstanding Linux Kernel bookで答えを見つけました
手順は、
getname( ) を呼び出して、プロセスのアドレス空間からファイル パス名を読み取ります。
get_unused_fd( ) を呼び出して、current->files->fd 内の空のスロットを見つけます。対応するインデックス (新しいファイル記述子) は fd ローカル変数に格納されます。
filp_open( ) 関数を呼び出し、パラメータとしてパス名、アクセス モード フラグ、および許可ビット マスクを渡します。この関数は、次の手順を実行します。
を。get_empty_filp( ) を呼び出して、新しいファイル オブジェクトを取得します。
b. フラグおよびモード パラメータの値に従って、ファイル オブジェクトの f_flags および f_mode フィールドを設定します。
c. 次の操作を実行する open_namei( ) を呼び出します。
i. Invokes lookup_dentry( ) to interpret the file pathname and gets the
dentry object associated with the requested file.
ii. Performs a series of checks to verify whether the process is permitted
to open the file as specified by the values of the flags parameter. If so,
returns the address of the dentry object; otherwise, returns an error code.
d. アクセスが書き込みの場合、inode オブジェクトの i_writecount フィールドの値をチェックします。負の値は、ファイルがメモリ マップされていることを意味し、書き込みアクセスを拒否する必要があることを指定します (第 15 章のセクション 15.2 を参照)。この場合、エラー コードを返します。その他の値は、実際にファイルに書き込んでいるプロセスの数を指定します。後者の場合、カウンターをインクリメントします。
e. ファイル オブジェクトのフィールドを初期化します。特に、f_op フィールドを inode オブジェクトの i_op->default_file_ops フィールドの内容に設定します。これにより、将来のファイル操作のためにすべての適切な機能がセットアップされます。
f. (デフォルトの) ファイル操作の open メソッドが定義されている場合は、それを呼び出します。
g. f_flags の O_CREAT、O_EXCL、O_NOCTTY、および O_TRUNC フラグをクリアします。
h. ファイル オブジェクトのアドレスを返します。