參考:
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 };
完。
