我将一些io内存映射到驱动程序中的vmalloced区域。我还使用标记(ioremap_page_range中的PAGE_SHARED
)与用户进程共享此区域。
现在我可以将此共享内存访问到用户空间。我可以写这个记忆。但是,如果我将此内存作为缓冲区传递给recv
或send
等系统调用,则调用将因内存不良(Memory not mapped into user process
)而失败。
但是,我确信我的缓冲区没有任何问题。因此,我共享内存和错误检查系统调用的方式似乎存在一些冲突。
驱动程序代码:
shared_buf = __get_vm_area(size, VM_IOREMAP, VMALLOCS_START, VMALLOC_END);
ioremap_page_range(shared_buf->addr, size, phy_addr_of_io, PAGE_SHARED);
之后我进行ioctl调用并将此shared_buf-> addr传递给用户空间应用程序。
我使用这个地址编写和阅读。然后我做
ret = recv(sockfd, shared_buf->area, 0) and I get an error "bad addr".
如果我尝试
而不是那样ret = recv(sockfd, local_buf, size, 0);
memcpy(shared_buf->addr, local_buf, size); Then it goes without issues.
(免责声明:我在未完成IOCTL的线程中使用shared_buf->area
。但是它是相同的过程。)
有人能看到错误吗?
答案 0 :(得分:3)
系统调用all验证传入的指针是否在地址空间的用户部分中。 vmalloc空间不在此用户部分;因此,您不能将其用于系统调用。更重要的是,不要让用户进程直接访问vmalloc地址空间中的内存。那只是在惹麻烦。并且可能非常不安全 - 其他进程也可以访问吗?写an mmapable file instead。