【问题标题】:Virtual Memory allocation without Physical Memory allocation没有物理内存分配的虚拟内存分配
【发布时间】:2011-09-26 06:48:18
【问题描述】:

我正在开发一个 Linux 内核项目,我需要找到一种在不分配物理内存的情况下分配虚拟内存的方法。例如,如果我使用这个:

char* buffer = my_virtual_mem_malloc(sizeof(char) * 512);

my_virtual_mem_malloc 是我的内核模块实现的一个新的 SYSCALL。写入此缓冲区的所有数据都通过使用套接字(而不是物理内存)存储在文件或其他服务器上。所以要完成这项工作,我需要请求虚拟内存并访问 vm_area_struct 结构以重新定义 vm_ops 结构。

您对此有什么想法吗?

谢谢

【问题讨论】:

  • sizeof(char) 被 C 语言标准保证为 1。
  • 当然,但这不是问题

标签: c linux memory virtual kernel


【解决方案1】:

这在架构上是不可能的。您可以创建具有写回例程的 vm 区域,该例程将数据复制到某处,但在某种程度上,您必须分配要写入的物理页面。

如果你同意,你可以简单地写一个FUSE driver,把它挂载到某个地方,然后从中映射一个文件。如果你不支持,那么你只需要write(),因为至少 x86 不支持在不分配物理页面的情况下重定向写入

【讨论】:

  • 嗯.. 您可以将该页面保留为未映射,然后在页面错误处理程序中检查错误指令并对其进行仿真。但这会非常慢,并且需要完整的指令解码器。
  • 所以可以通过处理页面错误异常来取消它,当它出现在我修改后的 malloc 使用的虚拟地址时?
  • @Corvus,caf 的想法在理论上是可行的,但却是一个可怕的想法。它会使访问速度降低一千倍,至少
  • I/O MMU 允许您直接写入设备缓冲区而无需任何中间内存,但我不会采用这种方法。
【解决方案2】:

有几种方法可以解决这个问题,但大多数都需要您先写入中间内存。

网络文件系统 (NFS)

最简单的方法是让服务器打开某种共享文件系统,例如NFS,然后使用mmap() 将远程文件映射到内存地址。然后,写入该地址实际上将写入操作系统的页面缓存,最终将在页面缓存已满或在预定义的系统超时后写入远程文件。

分布式共享内存 (DSM)

另一种方法是使用具有非常小的缓存大小的DSM

在计算机科学中,分布式共享内存 (DSM) 是一种内存架构形式,其中物理分离的内存可以作为一个逻辑共享地址空间进行寻址。

[...] 软件 DSM 系统可以在操作系统中实现,也可以作为编程库实现,并且可以被认为是底层虚拟内存架构的扩展。在操作系统中实现时,此类系统对开发人员是透明的;这意味着底层分布式内存对用户完全隐藏。

这意味着每个虚拟地址逻辑上映射到远程机器上的虚拟地址,写入它将执行以下操作:(a) 从远程机器接收页面并获得独占访问. (b) 更新页面数据。 (c) 释放页面并在远程机器再次读取时将其发送回。

在典型的 DSM 实现中,(c) 只会在远程机器再次读取数据时发生,但您可以从现有的 DSM 实现开始并更改行为,以便在本地机器页面缓存已满时发送数据.

I/O MMU

[...] IOMMU 将设备可见的虚拟地址(在此上下文中也称为设备地址或 I/O 地址)映射到物理地址。

这基本上意味着直接写入网络设备缓冲区,这实际上是为该设备实现一个替代驱动程序。 这种方法似乎是最复杂的,我认为这种方法没有任何好处。

这种方法实际上不使用任何中间内存,但绝对不推荐,除非系统对实时性要求很高。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2014-08-24
    • 2020-07-18
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多