我有一些代码(我无法更改)需要在本机 Win32 环境中工作。这段代码调用mmap()
and munmap()
,所以我使用CreateFileMapping()
,MapViewOfFile()
等创建了这些函数来完成同样的事情。最初这工作正常,并且代码能够按预期访问文件。不幸的是,代码继续到munmap()
它不再需要的文件的选定部分。
x = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
...
munmap(x, hdr_size);
munmap(x + foo, bar);
...
不幸的是,当您将指针传递到映射范围的中间时,UnmapViewOfFile()
它会破坏整个映射。更糟糕的是,我看不出我如何能够检测到这是一个部分取消映射请求并忽略它。
我曾尝试调用VirtualFree()
范围,但不出所料,这会产生 ERROR_INVALID_PARAMETER。
我开始认为我将不得不使用静态/全局变量来跟踪所有打开的内存映射,以便我可以检测并忽略部分取消映射,但我希望你有一个更好的主意......
编辑:
由于我上面不够明确: UnMapViewOfFile 的文档不能准确地反映该函数的行为。
取消映射整个视图并重新映射片段不是一个好的解决方案,因为您只能为新映射建议一个基地址,您无法真正控制它。的语义munmap()
不允许更改仍映射部分的基地址。
我真正需要的是一种找到已映射内存区域的基地址和大小的方法。
编辑2:现在我以这种方式重申问题,看起来该VirtualQuery()
功能就足够了。