首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不复制的Windows环形缓冲区

不复制的Windows环形缓冲区
EN

Stack Overflow用户
提问于 2009-06-19 08:21:06
回答 2查看 3.2K关注 0票数 6

Ring Buffer's Wikipedia entry上,有一个example code展示了一个针对UNIX系统的黑客攻击,即一块内存的相邻虚拟内存被mapped到相同的物理内存,从而实现了一个环形缓冲区,而不需要任何memcpy,等等。我想知道是否有一种方法可以在Windows中实现类似的东西

谢谢,弗雷泽

EN

Stack Overflow用户

发布于 2012-11-19 15:38:41

哦,嘿,这是最近让我很担心的话题。我在Windows上需要posix优化的环形缓冲区,主要是因为它的随机访问接口,但我从来不知道如何实现它。现在,@1800 INFORMATION提出的代码有时有效,有时不起作用,但不管怎样,这个想法很棒。

问题是,MapViewOfFileEx有时会失败,并返回ERROR_INVALID_ADDRESS,这意味着它无法将视图映射到pBuf+bufferSize。这是因为前面调用的MapViewOfFile选择了一个bufferSize长度的空闲地址空间(从pBuf开始),但是它不能保证这个地址空间是bufferSize*2长的。我们为什么需要bufferSize*2虚拟内存?因为我们的环形缓冲区需要包装。这就是第二个映射视图的用途。当读或写指针离开第一个视图时,它会进入第二个视图(因为它们在内存中是连续的),但实际上它是从相同的映射重新开始的。

代码语言:javascript
运行
复制
UINT_PTR addr;
HANDLE hMapFile;
LPVOID address, address2;

hMapFile = CreateFileMapping (    // create a mapping backed by a pagefile
    INVALID_HANDLE_VALUE,
    NULL,
    PAGE_EXECUTE_READWRITE,
    0,
    bufferSize*2,
    "Local\\mapping" );
if(hMapFile == NULL) 
    FAIL(CreateFileMapping);

address = MapViewOfFile (    // find a free bufferSize*2 address space
    hMapFile,
    FILE_MAP_ALL_ACCESS,
    0,                   
    0,                   
    bufferSize*2 );
if(address==NULL) 
    FAIL(MapViewOfFile);
UnmapViewOfFile(address);
// found it. hopefully it'll remain free while we map to it

addr = ((UINT_PTR)address);
address = MapViewOfFileEx (
    hMapFile,
    FILE_MAP_ALL_ACCESS,
    0,                   
    0,                   
    bufferSize, 
    (LPVOID)addr );

addr = ((UINT_PTR)address) + bufferSize;        
address2 = MapViewOfFileEx (
    hMapFile,
    FILE_MAP_ALL_ACCESS,
    0,                   
    0,                   
    bufferSize,
    (LPVOID)addr);  

if(address2==NULL)      
    FAIL(MapViewOfFileEx);

// when you're done with your ring buffer, call UnmapViewOfFile for 
// address and address2 and CloseHandle(hMapFile)
票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1016888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档