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

系统调用在linux中的iomapped内存失败.,第1张

概述我将一些io内存映射到驱动程序中的vmalloced区域.我也使用flag(ioremap_page_range中的PAGE_SHARED)与用户进程共享此区域. 现在我可以将这个共享内存访问到用户空间.我可以写这个记忆.但是,如果我将此内存作为缓冲区传递给系统调用(如recv或send),则调用将因内存不足而失败(内存未映射到用户进程). 但是,我确信我的缓冲区没有任何问题.因此,我共享内存和错 我将一些io内存映射到驱动程序中的vmalloced区域.我也使用flag(ioremap_page_range中的PAGE_SHARED)与用户进程共享此区域.

现在我可以将这个共享内存访问到用户空间.我可以写这个记忆.但是,如果我将此内存作为缓冲区传递给系统调用(如recv或send),则调用将因内存不足而失败(内存未映射到用户进程).

但是,我确信我的缓冲区没有任何问题.因此,我共享内存和错误检查系统调用的方式似乎存在一些冲突.

驱动代码:

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,0);  memcpy(shared_buf->addr,size); Then it goes without issues.

(免责声明:我确实在未完成IOCTL的线程中使用了shared_buf->区域.但是它是相同的过程.)

谁能看到错误?

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

以上是内存溢出为你收集整理的系统调用在linux中的iomapped内存失败.全部内容,希望文章能够帮你解决系统调用在linux中的iomapped内存失败.所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1017741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存