我们现在使用的设备需要有一个用户空间虚拟内存地址,我们尝试使用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()”是否可以?如果没有,任何正确的方法吗?
答案 0 :(得分:1)
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
。