我正在研究Linux内核项目,我需要找到一种在不分配物理内存的情况下分配虚拟内存的方法。例如,如果我使用它:
char* buffer = my_virtual_mem_malloc(sizeof(char) * 512);
my_virtual_mem_malloc是我的内核模块实现的新SYSCALL。写入此缓冲区的所有数据都通过套接字(不在物理内存上)存储在文件或其他服务器上。因此,要完成此任务,我需要请求虚拟内存并访问vm_area_struct结构以重新定义vm_ops结构。
你对此有什么想法吗?
THX
答案 0 :(得分:3)
这在结构上是不可能的。您可以创建具有在某处复制数据的写回例程的vm区域,但在某种程度上,您必须分配要写入的物理页面。
如果你对此感到满意,你可以简单地写一个FUSE driver,将它安装在某个地方,并从中取出mmap。如果你不是,那么你只需要write()
,因为x86不支持重定向写操作而不需要在所有分配物理页,至少。
答案 1 :(得分:0)
有一些解决此问题的方法,但大多数方法都要求您先写入中间内存。
最简单的方法就是让服务器打开某种共享文件系统,例如NFS,并使用mmap()
将远程文件映射到内存地址。然后,写入该地址实际上将写入操作系统的页面缓存,当页面缓存已满或预定义的系统超时后,最终将写入远程文件。
另一种方法是使用DSM,缓存大小非常小。
在计算机科学中,分布式共享存储器(DSM)是一种存储器架构形式,其中物理上分离的存储器可以作为一个逻辑共享地址空间进行寻址。
[...]软件DSM系统可以在操作系统中实现,也可以作为编程库实现,可以被认为是底层虚拟内存架构的扩展。当在操作系统中实现时,这样的系统对于开发者是透明的;这意味着底层分布式内存对用户完全隐藏。
这意味着每个虚拟地址逻辑映射到远程计算机上的虚拟地址,并且写入它将执行以下操作:(a)从远程计算机接收页面并获得独占访问权限。 (b)更新页面数据。 (c)释放页面并在再次读取时将其发送回远程机器。
在典型的DSM实现中,(c)仅在远程计算机将再次读取数据时发生,但您可以从现有DSM实现开始并更改行为,以便在本地计算机页面缓存已满时发送数据
[...] IOMMU将设备可见的虚拟地址(在此上下文中也称为设备地址或I / O地址)映射到物理地址。
这基本上意味着直接写入网络设备缓冲区,这实际上是为该设备实现替代驱动程序。 这种方法似乎最复杂,我认为这种方法没有任何好处。
这种方法实际上并没有使用任何中间内存,但除非系统有大量的实时要求,否则绝对不推荐使用。