丢失了一些从用户空间到内核空间的参数

时间:2014-02-18 03:27:45

标签: android linux-kernel hal android-kernel

我有一个关于转移参数的问题想咨询,

我需要将一些参数从用户空间传输到内核空间,但其中一个参数丢失(当我从内核空间检查时,该值不正确)。 但我不知道它为什么会丢失。

下面是我的一些代码和日志,丢失的参数是write_flag,我在用户空间中将write_flag设置为整数(2)。

但是当我在内核空间中打印write_flag时,它完全错了(1651866136)。 一些参数被转移没有问题,如操作码和arg。

[  859.877750] user.write_flag:1651866136, idata->ic.write_flag:1651866136      
[  859.883133] user.opcode:8, idata->ic.opcode:8                                
[  859.887421] user.arg:0, idata->ic.arg:0   

有谁可以提出我的想法来解决这个问题, write_flag的数据类型是int,opcode和arg是__u32。

感谢。

HAL方:

LOGI("dev->fd:%d, cmd_idx:%d, arg:%d.",dev->fd,mmc_local_cmd->opcode, mmc_local_cmd->arg);
LOGI("dev->write_flag:%d.",mmc_local_cmd->write_flag);
ret = ioctl(dev->fd,MMC_IOC_CMD,&mmc_local_cmd);

内核方面:

if (copy_from_user(&idata->ic, user, sizeof(idata->ic))) {
    err = -EFAULT;
    goto idata_err;
}
/*FIXME: write_flag is incorrect before copy_from_user execute */
printk("user.write_flag:%d, idata->ic.write_flag:%d\n",user->write_flag, idata->ic.write_flag);
printk("user.opcode:%d, idata->ic.opcode:%d\n",user->opcode, idata->ic.opcode);
printk("user.arg:%d, idata->ic.arg:%d\n",user->arg, idata->ic.arg);

1 个答案:

答案 0 :(得分:0)

我通过删除&因为我们不需要在这里参考。

ret = ioctl(dev->fd,MMC_IOC_CMD,mmc_local_cmd);