Windows 如何向CreateFileMapping/OpenFileMapping提供地址
是否有一个函数可用于提供要使用的地址映射 我正在试图找到一种方法来利用大页面,即使我必须映射小文件。我知道我会浪费记忆。或者,我可以使用VirtualAlloc分配一个页面大小的块,然后将其切块并映射到多个文件中。我假设,因为内存映射是由虚拟内存子系统支持的,所以这是不可能的——单个内存页可能必须由单个文件支持Windows 如何向CreateFileMapping/OpenFileMapping提供地址,windows,64-bit,huge-pages,Windows,64 Bit,Huge Pages,是否有一个函数可用于提供要使用的地址映射 我正在试图找到一种方法来利用大页面,即使我必须映射小文件。我知道我会浪费记忆。或者,我可以使用VirtualAlloc分配一个页面大小的块,然后将其切块并映射到多个文件中。我假设,因为内存映射是由虚拟内存子系统支持的,所以这是不可能的——单个内存页可能必须由单个文件支持 我想我会在做任何事情之前先问一下。我怀疑这是不可能的,但只是一个想法: 地址分配决策属于MapViewOfFile,而不是CreateFileMapping。而且MapViewOfFil
我想我会在做任何事情之前先问一下。我怀疑这是不可能的,但只是一个想法:
地址分配决策属于
MapViewOfFile
,而不是CreateFileMapping
。而且MapViewOfFile
肯定会在NTDLL.DLL
中调用一些本机API。您可以找出它调用哪个函数来实际创建映射,谁知道呢?该函数可能更灵活,允许使用KERNEL32
实现一些不可能的功能。(例如,我们知道PE文件节的映射方式是您无法用MapViewOfFile
模仿的)。映射由MapViewOfFile
完成,但您传递的地址必须是尚未使用的地址。(将一个地址映射到两个不同的东西是没有意义的。)MapViewOffilex允许您指定一个基址,但基址必须位于内存页的开头,因此无法将多个文件映射到一个页面。但是,一个页面占用的内存非常少,因此,除非您同时映射数十万个文件,否则真的没有必要担心。我认为您是最接近的答案。知道源代码在哪里吗?哈哈。看起来他们给了我们很大的页面,但没有足够的方法来利用它们。