copy_to_user 没有复制数据?
copy_to_user not copying data?
对于一个项目,我们正在从 SoC 系统上的嵌入式 FPGA 读取和写入数据。写作作品(现在只有 1 个字节,但是哦,好吧)。读取函数正确访问 FPGA(并获得正确的值)但由于某种原因 copy_to_user 不会向用户复制任何内容。 运行 我设备上的猫没有 return 任何东西。我希望有人能告诉我我哪里做错了。
其他信息:我们的目标是带有 ARMv7 处理器的 Altrera Cyclone V SoC 系统。我们正在使用 Altera 推荐的带有内核 4.3.0 的 buildroot 系统。
代码:
// Read function is called whenever a read in performed on one of the /dev devices
static ssize_t mydevice_read(struct file *file, char *buffer, size_t len, loff_t *offset) {
int success = 0;
u32 read_value32 = 0;
// Get the device struct out of the miscdev struct
struct mydevice_dev *dev = container_of(file->private_data, struct mydevice_dev, miscdev);
// Read data from FPGA
read_value32 = ioread32(dev->regs);
pr_info("Data received from FPGA: %d", read_value32);
success = copy_to_user(buffer, &read_value32, sizeof(read_value32));
pr_info("%d: %d bytes copied to userspace pointer 0x%p, value: %d!\n", success, sizeof(read_value32), buffer, dev->data_value8);
// If copy_to_user failed
if (success != 0) {
pr_info("Failed to copy current value to userspace!\n");
return -EFAULT;
}
return 0;
}
输出(包括内核消息和调试打印):
# insmod mymodule.ko
[ 701.922707] Initializing mymodule module
[ 701.926681] Probing for fpga devices...
[ 701.931382] Probing successful!
[ 701.935429] FPGA successfully initialized!
# echo -n -e \x81 > /dev/mydevice
# cat /dev/mydevice
[ 721.555795] Data received from FPGA: 129
[ 721.559539] 0: 4 bytes copied to userspace pointer 0xbec67c78, value: 129!
非常感谢!
你确定return 0;
吗?我认为这个函数应该 return 复制的字节数,在你的情况下这应该是 return sizeof(read_value32);
对于一个项目,我们正在从 SoC 系统上的嵌入式 FPGA 读取和写入数据。写作作品(现在只有 1 个字节,但是哦,好吧)。读取函数正确访问 FPGA(并获得正确的值)但由于某种原因 copy_to_user 不会向用户复制任何内容。 运行 我设备上的猫没有 return 任何东西。我希望有人能告诉我我哪里做错了。
其他信息:我们的目标是带有 ARMv7 处理器的 Altrera Cyclone V SoC 系统。我们正在使用 Altera 推荐的带有内核 4.3.0 的 buildroot 系统。
代码:
// Read function is called whenever a read in performed on one of the /dev devices
static ssize_t mydevice_read(struct file *file, char *buffer, size_t len, loff_t *offset) {
int success = 0;
u32 read_value32 = 0;
// Get the device struct out of the miscdev struct
struct mydevice_dev *dev = container_of(file->private_data, struct mydevice_dev, miscdev);
// Read data from FPGA
read_value32 = ioread32(dev->regs);
pr_info("Data received from FPGA: %d", read_value32);
success = copy_to_user(buffer, &read_value32, sizeof(read_value32));
pr_info("%d: %d bytes copied to userspace pointer 0x%p, value: %d!\n", success, sizeof(read_value32), buffer, dev->data_value8);
// If copy_to_user failed
if (success != 0) {
pr_info("Failed to copy current value to userspace!\n");
return -EFAULT;
}
return 0;
}
输出(包括内核消息和调试打印):
# insmod mymodule.ko
[ 701.922707] Initializing mymodule module
[ 701.926681] Probing for fpga devices...
[ 701.931382] Probing successful!
[ 701.935429] FPGA successfully initialized!
# echo -n -e \x81 > /dev/mydevice
# cat /dev/mydevice
[ 721.555795] Data received from FPGA: 129
[ 721.559539] 0: 4 bytes copied to userspace pointer 0xbec67c78, value: 129!
非常感谢!
你确定return 0;
吗?我认为这个函数应该 return 复制的字节数,在你的情况下这应该是 return sizeof(read_value32);