gpt4 book ai didi

copy_to_user 未返回预期数据

转载 作者:行者123 更新时间:2023-11-30 16:21:18 25 4
gpt4 key购买 nike

我的内核驱动程序中有一个 ioctl,需要在读取时返回一些数据。当我在用户空间中读回它时,它没有显示预期的结果。

用户空间片段:

typedef struct abc_T {
int size;
int addr;
int data[32];
} abc_T;

// Read
int abc_read(int addr, int size, int *data) {
abc_T abc = {};
int fd, retval;
abc.size = size;
abc.addr = addr;
fd = open("/dev/"ABC_DEV, O_RDWR);

if (fd >=0) {
retval = ioctl(fd, READ_ABC, &abc);
if (retval == 0)
memcpy(data, abc.data, size);

}
return retval;
}

内核:

static int ABC_ioctl(struct file * file, uint cmd, ulong arg)
{
ABC_T abc;
void __user * arg_ptr;
arg_ptr = (void *)arg;
int retval;

if (!access_ok(VERIFY_READ, arg_ptr, sizeof(ABC_T))) {

return -EACCES;
}

if (copy_from_user(&abc, arg_ptr,
sizeof(ABC_T)) != 0) {
return -EFAULT;
}

switch(cmd) {
case READ_ABC:
retval = read_func(&abc);
if (retval == 0) {
if (copy_to_user((void __user *)arg, &abc,
sizeof(ABC_T) != 0)) {
retval = -EFAULT;
} else {
retval = 0;
}
}
return retval;
}

我已经在 read_func 中打印了结果(即数据数组),并且可以看到读取的是预期值,但是在 copy_to_user 之后,当我在中打印 data 时用户空间,我看到全零。这段代码有什么问题吗?

最佳答案

您的括号在调用 copy_to_user 时已关闭。我认为您的意思是测试 copy_to_user 的响应是否为 != 0。相反,您将 sizeof(ABC_T) != 0 作为最后一个参数。由于 sizeof(ABC_T) 不为零,因此您的调用最终为 copy_to_user((void __user *)arg, &abc, true)

修复你的括号,看看是否能得到更好的结果:

if (copy_to_user((void __user *)arg, &abc, sizeof(ABC_T)) != 0) {
// ...
}

关于copy_to_user 未返回预期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54937997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com