参考:
https://www.cnblogs.com/super119/archive/2012/12/03/2799967.html
https://lwn.net/Articles/119652/
http://b8807053.pixnet.net/blog/post/3610561-ioctl%2cunlocked_ioctl%e5%92%8ccompat_ioctl
Linux内核中struct file_operations含有下面两个函数指针:
struct file_operations { ... ... long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); ... ... };
注意:
1、compat_ioctl:支持64bit的driver必须要实现的ioctl,当有32bit的userspace application call 64bit kernel的IOCTL的时候,这个callback会被调用到。如果没有实现compat_ioctl,那么32位的用户程序在64位的kernel上执行ioctl时会返回错误:Not a typewriter
2、如果是64位的用户程序运行在64位的kernel上,调用的是unlocked_ioctl,如果是32位的APP运行在32位的kernel上,调用的也是unlocked_ioctl
示例:
1 #ifdef CONFIG_COMPAT 2 static long debussy_compat_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) 3 { 4 return debussy_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); 5 } 6 #endif 7 8 static const struct file_operations debussy_fops = { 9 .owner = THIS_MODULE, 10 .unlocked_ioctl = debussy_ioctl, 11 #ifdef CONFIG_COMPAT 12 .compat_ioctl = debussy_compat_ioctl, 13 #endif 14 };
完。