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

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

我有一个数据结构

struct data {
int x;
char* y;
};

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

【问题讨论】:

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

标签: memory-management linux-kernel kernel linux-device-driver kernel-module


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 2012-03-02
      • 2011-12-18
      • 2016-10-12
      • 2011-12-16
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多