我正在编写一个带黑盒库的接口(称之为“A”),需要传递void*
分配。我想从两个其他库(称为“X”和“Y”)的两个单独分配中支持此分配,复制对两个分配的所有写入。从本质上讲,我想将所有写入“分叉”到两个现有的VA范围。诀窍是这些分配可能非常大,但只有少量字节写得稀疏,因此复制整个分配不是一种选择。目前,我正在使用write-watch memory我自己创建的第三个分配来完成此任务,但是有更有效的方法吗?或者,有没有办法将
基本上,这就是我今天所做的(半伪代码):
void* x = LibraryX.Allocate(size);
void* y = LibraryY.Allocate(size);
void* a = VirtualAlloc(size, WRITE_WATCH);
LibraryA.WriteSomeStuffToRandomLocations(a);
addresses = GetWriteWatch(a);
for(auto p : addresses)
{
memcpy(x, p, size);
memcpy(y, p, size);
}
理想情况下,我可以拥有这样的东西:
void* x = LibraryX.Allocate(size);
void* y = LibraryY.Allocate(size);
void* a = GetVARangeThatDuplicatesAllWritesTo(x, y);
LibraryA.WriteABunchOfStuff(a);
答案 0 :(得分:0)
如果那些外部库正在分配内存,那么你无能为力。如果您控制了分配和格式,则可以使用VirtualProtect使两个地址都指向相同的物理内存位置。如果数据稀疏,这将特别有吸引力,因为您只能根据需要提交页面。
所以简短的回答是"不是那种设计。"
我建议您仔细检查WriteWatch的成本,以及它触发的频率。您可能会对最终制作的memcpy()调用的费用和数量感到惊讶。
答案 1 :(得分:0)
如果您可以自己控制物理分配,则可以将两个虚拟地址引用到同一物理页面。但是,没有办法获取两个物理页面并使它们相同,因为您的LibraryY和LibraryX可能会分配正常的虚拟内存,每个分配都有自己独特的物理页面(换句话说,内存分配)完成了诸如HeapAlloc
,malloc
,realloc
,C ++' s new
和其他此类函数之类的操作。