C 读取MMAP DMA缓冲区时出现错误地址

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->

在我的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];
#定义数据大小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结尾的字符数组。
数据
不是缓冲区<代码>数据是指针。为了使它成为一个
缓冲区
,它需要有一个固定的大小。@qiubit
read()
返回什么?您忽略了返回值-不要这样做。另外,如果将
memcpy()
temp
转换为
data
,会发生什么情况?