0

転送パラメータについて相談したいのですが、

ユーザー空間からカーネル空間にいくつかのパラメーターを転送する必要がありますが、そのうちの 1 つが失われました (カーネル空間からチェックすると、値が正しくありません)。しかし、負けた理由がわかりません。

以下は私のコードとログの一部です。失われたパラメーターは write_flag です。ユーザー空間で write_flag を整数 (2) として設定しました。

しかし、カーネル空間で write_flag を出力すると、完全に間違っています (1651866136)。opcode や 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);
4

1 に答える 1

0

ここで参照する必要がないため、 & を削除して問題を修正しました。

ret = ioctl(dev->fd,MMC_IOC_CMD,mmc_local_cmd);
于 2014-02-18T07:31:44.033 に答える