장치 드라이버를 작성 했으므로 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;
}
이 무엇입니까?
커널 vs 사용자 공간에서는 크기가 다를 수 있으므로 'int'는 'ioctl'을 통해 전달하면 안됩니다. – mpe