作者wzbird (大鸟)
看板LinuxDev
标题[问题] 驱动程式 ioctl机制
时间Tue Feb 14 20:12:59 2012
hi 大家好,
我又读了平田丰那本LDD Programming驱动设计, 第六章, 关於ioctl
有一些心得, 跟大家分享, 当然也希望大家指出我错的地方
ioctl在2.6.36版以後有一些变动, 这边的说法仍然以旧版的为主
==
其实我在读这边的时候, 最主要的疑惑是是(不知道会不会很蠢)
为什麽user space 呼叫ioctl的时候只有带入三个参数?
EX: ioctl(fd, IOCTL_VALGET, &cmd);(平田丰P.160)
但是我看ioctl的原型是四个参数
EX: int devone_ioctl(struct inode *inode, struct file *filp, unsigned int
cmd, unsigned long arg)(平田丰P.155)
经过了反覆的推敲, 以及下去追原始码, 我想user space 的 ioctl()(平田丰P.160)与
file_operations中的ioctl()方法, 并不是同一个函式, 所以从来就没有三个或四个参数
的问题
user space呼叫了 ioctl()之後,
ioctl() 透过unistd.h中的定义(但是这边我还不太清楚怎麽定义的, 有人可以告诉我
吗?)
------------unistd.h------------
/* fs/ioctl.c */
#define __NR_ioctl 29
__SYSCALL(__NR_ioctl, sys_ioctl)
--------------------------------
定义了 ioctl() 其实就是呼叫system call, sys_ioctl(),
而/fs/ioctl.c中的 SYSCALL_DEFINE3() 就是sys_ioctl(),
这个 SYSCALL_DEFINE3() 会透过一些#define(写在syscalls.h中), 定义为sys_ioctl(),
里面描述了user space中呼叫了ioctl()之後应该要做哪一些处理, 以及ioctl()的"三"个
参数
然後sys_ioctl()(也就是SYSCALL_DEFINE3())里面呼叫do_vfs_ioctl(),
do_vfs_ioctl()再呼叫vfs_ioctl()
最後vfs_ioctl()里面会呼叫file_operations中的ioctl()(2.6.36以後是呼叫
unlock_ioctl()),
在这边才是送"四"个参数给file_operations中的ioctl()
然後就做你的驱动程式里面的.ioctl = your_ioctl
以上是我的心得, 写得很乱, 见笑了.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.177.12.226
1F:推 alongalone:有分享有推~~ 02/14 23:16
2F:推 darkangel:有分享有推! 02/15 23:14
3F:推 Gway:分享就要推一下 02/18 11:36
4F:推 mimi0213:很不错 02/18 22:13
5F:推 guestone:推精神可佳 03/07 11:24