使用do_mmap()在Linux设备驱动

问题描述:

我们在现在的工作的设备需要有一个用户空间的虚拟内存地址,我们尝试如下使用do_mmap():使用do_mmap()在Linux设备驱动

*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