标签:device-driver linux-device-driver c-3 linux
我正在编写一个简单的驱动程序.
在这里,我正在学习ioctl调用,它们可以在copy_to_user和copy_from_user部分中完美地工作,而在get_user和put_user部分中则不能.如果通过这些功能发送一些数据,它将起作用.问题是当我只需要传递整数或字符值时:
long ioctl_funcs(struct file *filp,unsigned int cmd, unsigned long arg)
{
int ret=0;
int len=10;
char val='d';
char valplusone='d';
switch(cmd) {
case IOCTL_HELLO:
printk(KERN_INFO "Hello ioctl world");
case READ_IOCTL:
copy_to_user((char *)arg, buf, 200);
//works fine
break;
case WRITE_IOCTL:
copy_from_user(buf, (char *)arg, len);
//works fine
buf[6]=' ';
buf[7]='t';
buf[8]='o';
buf[9]='o';
buf[10]='\n';
break;
case READ_ONE:
printk(KERN_ALERT "valplusone (put user)is %c \n",valplusone);
put_user(valplusone,(char __user *) arg);
//problem
break;
case WRITE_ONE:
if(access_ok(VERIFY_WRITE,(void*)arg,sizeof(char))!=1)
{
printk(KERN_ALERT "access not ok\n");
return -EFAULT;
}
else{
printk(KERN_ALERT "****arg %l",arg);
get_user(val,(char __user *)arg);
valplusone='t';
printk(KERN_ALERT "val (get user)is %c\n",val);
break;
}
}
return ret;
}
在上面的部分中,它对
复制到用户从用户复制,但在get_user put_user情况下不是
现在,用户端代码为:
char sent,received;
if(retval=ioctl(fd, WRITE_ONE, sent) < 0)
perror("third ioctl");
printf("you sent %c\nretval is %d\n",sent,retval);
if(ioctl(fd, READ_ONE, received) < 0)
perror("fourth ioctl");
printf("you got %c",received);
-----------------------------------
解决方法:
您必须传递地址,而不是值.例:
if (ioctl(fd, READ_ONE, &received) < 0)
…
标签:device-driver,linux-device-driver,c-3,linux 来源: https://codeday.me/bug/20191120/2044457.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。