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

时间:2011-03-15 10:03:32

标签: 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()”是否可以?如果没有,任何正确的方法吗?

1 个答案:

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