在我的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内存的大小不应成为问题。