2011-06-07 35 views
5

假設我已經定義了以下內容。如何從用戶空間調用compat ioctl?任何人都可以提供一些實例嗎?

#define MY_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, arg1) 
#define MY_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, arg2) 
#ifdef CONFIG_COMPAT 
#define MY_COMPAT_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, compat_arg1) 
#define MY_COMPAT_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, compat_arg2) 
#endif 

現在,當我們從用戶空間做的ioctl,我們通常做

ioctl(fd, MY_IOCTL_CMD1, &arg1) 

問:我們真的需要有一個ioctl與MY_COMPAT_IOCTL_CMD1的要求嗎?

在devide代碼中,我有如下處理程序定義。 IOCTL:device_ioctl

#ifdef CONFIG_COMPAT 
compat_ioctl: device_compat_ioctl 
#endif 

可有人請提供一些解決這個解釋嗎?

回答

6

這個compat的東西是用於在64位內核中運行一個32位程序。當您從64位內核上的32位程序調用ioctl(fd, MY_IOCTL_CMD1, &arg1)時,內核將會將該ioctl轉移到file_operations結構中的.compat_ioctl函數。這個compat_ioctl函數負責複製用戶參數arg1,就好像它是使用32位佈局的compat_arg1一樣。 compat_arg1 typedef在內核中定義,因此在編譯爲64位時,其結構與爲32位編譯的arg1完全相同。

創建cmd id時,MY_IOCTL_CMD1的定義將考慮sizeof arg1。當您爲32位機器編譯程序時,MY_IOCTL_CMD1的值將與爲64位機器編譯的值不同。但是,32位MY_IOCTL_CMD1應與內核中的64位MY_COMPAT_IOCTL_CMD1具有相同的值。

從來沒有必要在用戶空間應用程序中使用compat_arg1MY_COMPAT_IOCTL_CMD1。這些僅適用於在內核中編譯的代碼。

相關問題