使用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
。