C 读取MMAP DMA缓冲区时出现错误地址
在我的Linux设备驱动程序中,我有以下mmap实现:C 读取MMAP DMA缓冲区时出现错误地址,c,linux,linux-device-driver,dma,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->
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];
#定义数据大小0x4000
#定义输入数据大小0x1000
fd=打开(“/dev/mydevice”,O_RDWR);
input_fd=打开(“input.txt”,仅限O_rdon);
字符*数据;
数据=mmap(空,数据大小,保护读取,保护写入,映射共享,fd,0);
字符温度[数据大小];
//a)返回错误号中的错误地址
读取(输入fd、数据、输入数据大小);
//b)以后与设备一起使用时,工作正常
读取(输入fd、温度、输入数据大小);
对于(int i=0;i
我想知道为什么a)不能工作,即使b)在以后使用设备时,在data
buffer中传递数据时工作正常。可能是我用错了dma\u mmap\u coherent()
,但我找不到任何文档,这将帮助我解决问题
在上面的代码中,
u->data\u size
大于data\u size
,所以返回的mmap内存大小应该不是问题。data
存储从mmap
返回的内存地址<代码>数据在read()
中再次使用。为什么?我想将数据从input\u fd
读入data
缓冲区,这样设备就可以看到它。下面是read
上的人:read()尝试从文件描述符fd读入缓冲区,从buf开始,最多读取个字节。我猜read
命令需要以NUL结尾的字符数组作为第二个参数<代码>数据
可能是也可能不是以NUL结尾的字符数组。数据
不是缓冲区<代码>数据是指针。为了使它成为一个缓冲区
,它需要有一个固定的大小。@qiubitread()
返回什么?您忽略了返回值-不要这样做。另外,如果将memcpy()
从temp
转换为data
,会发生什么情况?