在DLL中创建共享内存

Barefoot

发布日期: 2018-12-20 12:32:06 浏览量: 1555
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

背景

我们都知道在 32 位系统上,每个进程都有自己 4GB 大小的独立空间,互不影响。当然,对内核了解的同学则会质疑说,4GB 大小的内容可以大致分为两部分,低 2 GB内存空间是用户地址空间,高 2 GB是内核地址空间,而内核地址空间是共享的,并非独立。是的,这没错。所以,本文中所指的独立空间是用户地址空间。

举个例子来说,进程1 的 0x400000 内存地址和 进程2 中 0x400000 内存地址是没有任何关联。任意修改其中一个内存里的数据,是不影响另一个的。这边是进程独立性。

但是,本文要介绍的这个知识点,就是要突破这个独立性的显示,创建进程共享内存。确切的说是在DLL中创建共享内存,就是在DLL中创建一个变量,然后DLL被加载到多个进程空间,只要其中一个进程修改了该变量的值,其他进程DLL中的这个值也会改变,就相当于多个进程共享一块内存。

实现原理

实现原理比较简单,就是先为DLL创建一个数据段,然后再对程序的链接器进行设置,使其在程序编译完毕开始链接的时候,根据设置的链接选项,把指定的数据段链接为共享数据段。这样,就可以创建共享内存了。

  1. #pragma data_seg("MySeg")
  2. char g_szText[256] = {0};
  3. #pragma data_seg()
  4. #pragma comment(linker, "/section:MySeg,RWS")

例如,在上面的代码中,我们使用 #pragma data_seg 创建了一个名为 MySeg 的数据段,接着使用 /section:MySeg,RWS 把 MySeg 数据段设置为可读、可写、可共享的共享数据段。

程序测试

我们开发一个程序加载这个创建了共享内存的DLL,然后调用它的导出函数 Change 来修改共享内存变量的值,调用 Show 来显示共享内存变量的值。发现,只要有一个进程修改了这个变量,其他所有进程里的变量也跟着改变。

总结

这个实现上比较简单,难点就是在思想上的转换,要理解什么是共享内存的思想。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download Dll_ShareMem_Test.7z ( 2.59mb, 18次下载 )

keyboard_arrow_left上一篇 : 内存映射文件 跨域 : 下一篇keyboard_arrow_right



Barefoot
2018-11-07 11:29:44
使用 #pragma data_seg 创建了一个数据段,接着使用 /section:MySeg,RWS 把这个数据段设置为可读、可写、可共享的共享数据段
WonderBoy
2019-04-22 19:12:57
共享内存

发送私信

任何值得做的,就把它做好

10
文章数
21
评论数
最近文章
eject