Linuxドライバモジュールのioctlプロトタイプは次のとおりです。
int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);
または
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
しかし、sys/ioctl.hでは
int ioctl(int fd, int request, void *argp);
最初のパラメーターは別のタイプです。 ioctl呼び出し元とドライバの間に対応するパラメータ(ファイル記述子からファイル構造ポインタへ)を変換するモジュールはありますか?
このマッピングはどのように機能しますか? (ファイル記述子からファイルへ)。
答え1
(4.13)には${kernel_root}/fs/ioctl.c
次のものがあります。
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
これはSYSCALL_DEFINE3
、これらの引数を取得し、システムコールに適した署名に拡張するマクロです。この関数は、ioctl
ユーザー空間でシステムを呼び出すための論理エントリポイントです。その後、関数はstruct fd
特定のファイル記述子に対応するファイル記述子を見つけ、呼び出しはドライバに到達do_vfs_ioctl
する前にVFSレイヤを通過しますが、それを使用して検索を開始できますstruct file
。struct fd