C 在Linux设备驱动程序中使用do_mmap()

C 在Linux设备驱动程序中使用do_mmap(),c,linux,memory-management,linux-kernel,kernel,C,Linux,Memory Management,Linux Kernel,Kernel,我们现在使用的设备需要一个用户空间虚拟内存地址,我们尝试使用do_mmap(),如下所示: *uvaddr = (void *)do_mmap(0, 0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, 0); 但我们有以下错误 Unable to handle kernel paging request for data at ad8 在设备驱动程序中使用“do_mmap()”可以吗?如果没有,有什么正确的方法吗?可能是do_mmap成功了,但是uva

我们现在使用的设备需要一个用户空间虚拟内存地址,我们尝试使用do_mmap(),如下所示:

*uvaddr = (void *)do_mmap(0, 0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, 0);
但我们有以下错误

Unable to handle kernel paging request for data at ad8

在设备驱动程序中使用“do_mmap()”可以吗?如果没有,有什么正确的方法吗?

可能是
do_mmap
成功了,但是
uvaddr
没有指向存储结果的有效位置。要确定这一点,请执行以下操作:

void *mmap_result;
printk(KERN_DEBUG "uvaddr = %p", uvaddr);
mmap_result = (void *)do_mmap(0, 0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, 0);
printk(KERN_DEBUG "mmap_result = %p", mmap_result);
*uvaddr = mmap_result;
这将告诉您哪些失败:调用
do_mmap
或分配到
*uvaddr