虚拟内存分配没有物理内存分配

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

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

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

你有什么想法吗?

谢谢

这在架构上是不可能的。 您可以创建具有回写例程的虚拟磁盘区域,以便在某处复制数据,但在某些级别上,必须分配要写入的物理页面。

如果你没有问题的话,你可以简单地写一个FUSE驱动 ,把它安装在某个地方,然后用它来映射一个文件。 如果你没有,那么你只需write() ,因为重定向写入,而不分配物理页面至少不支持x86。

有几种解决这个问题的方法,但是其中大部分都需要先写入中间存储器。

网络文件系统(NFS)

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

分布式共享内存(DSM)

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

在计算机科学中,分布式共享存储器(DSM)是一种存储器体系结构,其物理上分离的存储器可作为一个逻辑共享的地址空间寻址。

软件DSM系统可以在操作系统或编程库中实现,可以被认为是底层虚拟内存体系结构的扩展。 在操作系统中实施时,这样的系统对于开发者来说是透明的; 这意味着底层分布式内存对用户是完全隐藏的。

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

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

I / O MMU

IOMMU将设备可见的虚拟地址(在这种情况下也称为设备地址或I / O地址)映射到物理地址。

这基本上意味着直接写入网络设备缓冲区,该缓冲区实际上是为该设备实施替代驱动程序。 这种做法似乎是最复杂的,我看不到这种方法的好处。

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