2012-04-09 62 views
11

我正在開發使用unlocked_ioctl的內核模塊。我使用內核版本2.6.24-23-generic對其進行了測試,並且它完美地工作。現在我嘗試了內核版本3.3.1-1-ARCH,併發生了一些奇怪的事情:當請求值(cmd)爲2時,ioctl函數未執行。它返回0,但函數未執行。爲了檢查它不執行我做了以下內容:如果cmd = 2,則不會調用ioctl

static long midriver_ioctl(struct file *file, 
    unsigned int cmd, unsigned long arg) { 

printk("Called with cmd = %d\n", cmd); 

我寫了從0這個設備以4096調用的ioctl一個測試程序,我可以在dmesg的用CMD稱爲消息」中看到= n「表示除了」2「之外的所有這些值,這是唯一沒有顯示的值。

我做錯了什麼線索?

謝謝你在前進,

+0

一些代碼了在鏈攔截CMD == 2和處理它的列表? – zvrba 2012-04-09 09:32:05

回答

9

看看上this

546 int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, 
547    unsigned long arg) 
548 { 
549  int error = 0; 
550  int __user *argp = (int __user *)arg; 
551  struct inode *inode = filp->f_path.dentry->d_inode; 
552 
553  switch (cmd) { 
554  case FIOCLEX: 
555    set_close_on_exec(fd, 1); 
556    break; 
557 
558  case FIONCLEX: 
559    set_close_on_exec(fd, 0); 
560    break; 
561 
562  case FIONBIO: 
563    error = ioctl_fionbio(filp, argp); 
564    break; 
565 
566  case FIOASYNC: 
567    error = ioctl_fioasync(fd, filp, argp); 
568    break; 
569 
570  case FIOQSIZE: 
571    if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) || 
572     S_ISLNK(inode->i_mode)) { 
573      loff_t res = inode_get_bytes(inode); 
574      error = copy_to_user(argp, &res, sizeof(res)) ? 
575          -EFAULT : 0; 
576    } else 
577      error = -ENOTTY; 
578    break; 
579 
580  case FIFREEZE: 
581    error = ioctl_fsfreeze(filp); 
582    break; 
583 
584  case FITHAW: 
585    error = ioctl_fsthaw(filp); 
586    break; 
587 
588  case FS_IOC_FIEMAP: 
589    return ioctl_fiemap(filp, arg); 
590 
591  case FIGETBSZ: 
592    return put_user(inode->i_sb->s_blocksize, argp); 
593 
594  default: 
595    if (S_ISREG(inode->i_mode)) 
596      error = file_ioctl(filp, cmd, arg); 
597    else 
598      error = vfs_ioctl(filp, cmd, arg); 
599    break; 
600  } 
601  return error; 
602 

正如你所看到的,有一些的開關情況之前vfs_ioctlfile_ioctl電話。

+0

我沒有看到相關性,這些情況都不適用 – Hasturkun 2012-04-09 09:40:54

+1

我糾正了,'FIGETBSZ'的值實際上是2,+1 – Hasturkun 2012-04-09 09:43:12

3

正如@Ilya指出的那樣,您遇到了一般情況(本例中爲FIGETBSZ)。

通常情況下,您希望使用_IO family of macros(使用唯一類型)編寫ioctl命令以避免衝突。

我建議從內核文檔閱讀ioctl-number.txt的更多信息,包括最常用的類型

+0

這是一個使用'_IOx'的最小'ioctl'示例:https:// stackoverflow的.com /一個/895245分之44613896 – 2017-06-18 10:11:57

相關問題