2016-04-15 48 views
0

我正在爲embeeded系統創建一個驅動程序。我正在使用IOCTL函數。 設備註冊正確,打開和寫入功能按預期工作,但IOCTL不能。IOCTL:僅在開關櫃中使用參數0

當我從參數0的用戶空間調用IOCTL時,ioctl_num = 0調用my_ioctl函數,但是當我使用任何其他值時,my_ioctl內核函數未被調用。

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

當我使用READ_IOCTL(0)從用戶空間進行IOCTL調用時,一切工作正常。但是,當我嘗試WRITE_IOCTL和ASK_VALUE(1和2)。

如果我使用以下命令:

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

只適用WRITE_IOCTL從用戶空間調用。我正在使用Linux 3.16和PowerPC。任何想法有什麼不對?

+0

這裏是一個示例驅動程序。可能會有所幫助https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir – Jeyaram

+0

感謝您的回答。我看過代碼,但它看起來與我所做的非常相似。它看起來像程序不會重組魔術數字。任何想法爲什麼它與0,而不是與1,2,3等工作? –

+0

'任何想法爲什麼它與0一起工作,而不是與1,2,3等?' - 可能,您的代碼符合預定義的ioctl代碼。參見[man ioctl_list](http://man7.org/linux/man-pages/man2/ioctl_list.2.html)。 – Tsyvarev

回答

0

我找到了解決方案。我在64位的內核中。用戶空間中的c代碼是32位的。我必須在64位編譯才能工作。