如何使用 mmap 在用户空间和内核之间共享内存并且数据没有文件支持

Posted

技术标签:

【中文标题】如何使用 mmap 在用户空间和内核之间共享内存并且数据没有文件支持【英文标题】:How to share memory between user space and kernel using mmap and the data is not backed by a file 【发布时间】:2014-07-29 12:44:02 【问题描述】:

如何在没有文件支持的用户空间和内核之间共享内存?如果 mmap 使用 MAP_ANON 完成,如何与内核空间共享?

我有一个数据结构

struct data 
int x;
char* y;
;

这个数据结构由用户进程和内核更新。如果我使用 mmap,我没有支持的文件。我该怎么做。我也不能使用 copy_from_user,因为内核和用户进程会定期更新结构。请告知

【问题讨论】:

如果您控制访问此类数据结构的内核代码。例如,您可以更新该代码以在 debugfs 中创建字符设备或文件,并使用该文件来支持映射的内存。另见:***.com/questions/11501527 请注意,如果您想在用户空间和内核空间之间传递字符串(正如该结构中的 char * y 所建议的那样),您还需要存储字符串本身(不仅是指向它)在用户空间和内核空间之间共享的内存中的某个位置。或者,依赖 copy_to_user/copy_from_user。 How to mmap a Linux kernel buffer to user space?的可能重复 【参考方案1】:

我可以向你推荐类似的东西,但我不确定这是否是你需要的:我已经在 PowerPC 上开发了这个。

    限制内核可以看到的内存(比如比以前少 2MB),即如果原始内存为 1GB,则新内存为 1022MB,在 bootargs 中的 mem=1022M 的帮助下

    现在通过内核中的 ioremap(start address=0x3FE00000, size=2MB) 在 1022MB 创建这个结构。

    结构数据 *data_kernel = ioremap(...)

    通过mmap在用户空间使用/更新相同(起始地址=0x3FE0 0000,大小2MB)

    结构数据 *data_user = mmap(...)

【讨论】:

【参考方案2】:

为什么不使用 UIO 驱动程序? uio 驱动导出一个/dev/uioX 文件,mmap 使用该文件在内核空间和用户空间之间共享内存。

uio 的主要目标是与用户应用程序共享物理内存,以快速开发用户空间驱动程序。但是,如果您使用 UIO_MEM_LOGICAL 配置 uio_mem 结构 memtype,您也可以与它共享内核分配的内存。

【讨论】:

以上是关于如何使用 mmap 在用户空间和内核之间共享内存并且数据没有文件支持的主要内容,如果未能解决你的问题,请参考以下文章

Linux之共享内存shm和内存映射mmap

Linux mmap原理

linux下通过shmget创建的共享内存,是属于用户空间还是内核空间?

内存映射:小块内存申请brk和申请大块内存的Mmap分析

mmap详谈

将 mmap 的区域传回内核空间