在为连接到旧 PowerPC 的自定义硬件的字符设备驱动程序编写 IOCTL 时,我发现了一个奇怪的问题。这是我的代码的抽象:
u32 mydev_data;
...
static long mydev_ioctl(struct file * file, unsigned int cmd, unsigned long arg)
{
void __user *user_arg = (void __user *)arg;
long result;
switch(cmd) {
case MYDEV_GETDATA:
result = put_user(mydev_data, user_arg);
break;
...
}
return result;
}
现在,这会返回垃圾。但是,当我更换线路时
result = put_user(mydev_data, user_arg);
和
result = put_user(mydev_data, (unsigned long __user *) user_arg);
问题消失了。
这里发生了什么?由于 user_arg 被标记为 __user *,唯一的区别是 void 与 unsigned long。但我认为指针类型在这里并不重要。显然我错了,但有人可以解释为什么吗?