读入mmapped DMA缓冲区时出现错误的地址错误

时间:2017-05-23 07:55:46

标签: c linux linux-device-driver dma

在我的Linux设备驱动程序中,我有以下mmap实现:

static int device_mmap(struct file *f, struct vm_area_struct *vma) {
    struct device_user *u = f->private_data;
    dma_mmap_coherent(&u->device->pdev->dev,
        vma, u->data, u->data_dma, u->data_size);
    return 0;
}

我基本上尝试将分配的DMA相干缓冲区从内核内存映射到用户空间。

然后,在用户空间应用程序中,我执行以下操作:

#define DATA_SIZE 0x4000
#define INPUT_DATA_SIZE 0x1000

fd = open("/dev/mydevice", O_RDWR);
input_fd = open("input.txt", O_RDONLY);
char *data;
data = mmap(NULL, DATA_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
char temp[DATA_SIZE];

// a) Returns bad address in errno
read(input_fd, data, INPUT_DATA_SIZE);

// b) Works ok, when used later with device
read(input_fd, temp, INPUT_DATA_SIZE);
for(int i = 0; i < INPUT_DATA_SIZE; i++)
    data[i] = temp[i];

我想知道a)为什么不起作用,即使看起来b)在以后使用data缓冲区中传递的数据使用设备时也能正常工作。我可能错误地使用dma_mmap_coherent(),但我无法找到任何可以帮助我解决问题的文档。

在上面的代码中,u->data_size大于DATA_SIZE,因此返回的mmapped内存的大小不应成为问题。

0 个答案:

没有答案