2012-08-26 2 views
1

장치 드라이버를 작성 했으므로 int 값을 전달해야합니다. 이것을 위해 copy_from_user()를 사용하고 있습니다. 여기에 내가 모듈이 제대로 작동 TEST_IOCTL & TEST_IOCTL_ONE를 호출 할 때 내가 지금까지장치 드라이버 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; 

} 

을했을 것입니다. 그러나 PASS_STRUCT_ARRAY_SIZE으로 전화하면 시스템이 정지합니다.

사용자 공간 코드는 내가 무슨 일을하고있을 수

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

이 무엇입니까?

+1

커널 vs 사용자 공간에서는 크기가 다를 수 있으므로 'int'는 'ioctl'을 통해 전달하면 안됩니다. – mpe

답변

1

죄송합니다. 이전 답변이 잘못되었습니다. 인수가 정수이기 때문에 당신은 copy_from_user없이 사용한다 : 인수가 포인터 때

SIZE = arg; 

는 당신은 copy_from_user이 필요합니다.

+0

감사합니다 :) 작동했지만, 10을 지나가고 있습니다. 0을 인쇄합니다. 왜? – user340

+0

@kani 그러면 작동하지 않습니다. -? 나는 확신 할 수 없다. 나는 잠시 동안 이것을하지 않았다. – cnicutar

+0

@kani 솔직히 내가 뭘 생각하는지 모르겠다. 나는 편집했다. – cnicutar