2012-08-26 117 views
1

我寫了一個設備驅動程序,需要傳遞一個int值給它。我正在使用copy_from_user()。以下是我迄今所做的,設備驅動程序IOCTL傳遞int

#define MY_MAGIC 'G' 
#define TEST_IOCTL _IO(MY_MAGIC, 0) 
#define PASS_STRUCT_ARRAY_SIZE _IOW(MY_MAGIC, 1, int) 
#define TEST_IOCTL_ONE _IO(MY_MAGIC, 2) 


int major; 

int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){ 

int ret, SIZE; 

switch(cmd){ 

    case TEST_IOCTL: 
     printk("NO argument IOCTL called\n"); 
     break; 

    case PASS_STRUCT_ARRAY_SIZE: 
      printk("Inside PASS_STRUCT_ARRAY_SIZE\n"); 
     ret = copy_from_user(SIZE, arg, sizeof(int)); 
     if(ret < 0){ 
      printk("Error in PASS_STRUCT_ARRAY_SIZE\n"); 
      return -1; 
     } 
     printk("Struct Array Size : %d\n",SIZE); 
     break; 

    case TEST_IOCTL_ONE: 
     printk("NO argument IOCTL_ONE called\n"); 
     break; 

    default : 
     return -ENOTTY; 
} 

return 0; 

} 

當我打電話TEST_IOCTL & TEST_IOCTL_ONE模塊正常工作。但是,當我撥打PASS_STRUCT_ARRAY_SIZE時,系統凍結。

用戶空間的代碼是這樣,

if(ioctl(fd, PASS_STRUCT_ARRAY_SIZE, 10) < 0){ 
    perror("PASS_STRUCT_ARRAY_SIZE : "); 
     return -1; 
} 

我能是做錯了什麼?

+1

你永遠不應該通過'ioctl'傳遞一個'int',因爲它可能是在內核VS用戶空間的大小不同。 – mpe

回答

1

對不起,我之前的回答是錯誤的。由於參數是一個整數,你應該只使用它,而copy_from_user

SIZE = arg; 

您只需要copy_from_user當參數是一個指針。

+0

謝謝:)它的工作,但通過10,它打印0.爲什麼? – user340

+0

@kani然後它沒有工作: - ?我不確定,我有一段時間沒有這樣做。 – cnicutar

+0

@kani我真的不知道我在想什麼,我編輯過。 – cnicutar