系统调用在linux中的iomapped内存失败。

时间:2012-03-29 20:50:34

标签: linux linux-kernel device-driver

我将一些io内存映射到驱动程序中的vmalloced区域。我还使用标记(ioremap_page_range中的PAGE_SHARED)与用户进程共享此区域。

现在我可以将此共享内存访问到用户空间。我可以写这个记忆。但是,如果我将此内存作为缓冲区传递给recvsend等系统调用,则调用将因内存不良(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。但是它是相同的过程。)

有人能看到错误吗?

1 个答案:

答案 0 :(得分:3)

系统调用all验证传入的指针是否在地址空间的用户部分中。 vmalloc空间不在此用户部分;因此,您不能将其用于系统调用。更重要的是,不要让用户进程直接访问vmalloc地址空间中的内存。那只是在惹麻烦。并且可能非常不安全 - 其他进程也可以访问吗?写an mmapable file instead