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

发布于 2024-10-22 04:13:28 字数 327 浏览 4 评论 0原文

我们现在工作的设备需要有一个用户空间虚拟内存地址,我们尝试使用 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

Is it OK to use "do_mmap()" in a device driver?如果没有,有什么正确的方法吗?

The device we work at now need to have a user space virtual memory address, we try to use do_mmap() as below:

*uvaddr = (void *)do_mmap(0, 0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, 0);

But we got following error

Unable to handle kernel paging request for data at ad8

Is it okay to use "do_mmap()" in a device driver? If not, any correct way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝梦月影 2024-10-29 04:13:28

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 的赋值。

It's possible that do_mmap is succeeding, but uvaddr does not point to a valid location to store the result. To check this for sure, do something like:

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;

This should tell you for certain which is failing: the call to do_mmap or the assignment to *uvaddr.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文