1

我有一个 pci 设备,我想要的只是通过从 /dev/pcidevice 中“cat”来读取它的内存。我对 char 设备的读取功能的第一次尝试如下所示:

ssize_t cdev_read(struct file *filp, char __user *buffer, size_t count, loff_t *f_pos) {

    ssize_t retval = 0;
    struct mypci_dev *device = filp->private_data;

/* reading data from pci device */
    device->values.fst = ioread16(device->bar[0]+OFFSET_FST);
    device->values.snd = ioread16(device->bar[0]+OFFSET_SND);
    ...
    device->values.lst = ioread16(device->bar[0]+OFFSET_LST);

    retval = copy_to_user(buffer, &device->values.fst, count);
    return retval;
}

它没有用:/我将 copy_to_user 行更改为

retval = copy_to_user(buffer, "dummy", strlen("dummy")+1);

但 cat /dev/pcidevice 仍然没有返回任何内容。

接下来,我将所有 ioread16 调用转移到 cdev_open() 中,我得到了我想要的。但现在我很好奇为什么它只能这样工作。我怎样才能让它以另一种方式工作?ATM 我会考虑开始复制等的计时器,但是等到 ioreads 完成就足够了。有任何想法吗?

4

1 回答 1

1

copy_to_user()函数返回无法复制的字节数。成功时,它返回0. 现在想象一下用户空间在读取 0 字节时会有多惊讶。

真正的问题是它实际上是如何在内部工作的cdev_open()?我希望您阅读该函数中的 I/O 栏,而不向用户空间发送任何内容。rmb();在这种情况下,请在调用之前尝试在读取之后添加,copy_to_user()以确保每次读取都已完成(rmb()是读取内存屏障)。

另外,如果您还没有这样做,请查看 LDD第 3章和第 5 章。

希望能帮助到你。快乐黑客!

于 2013-02-28T18:01:47.717 回答