刚了解到。赶快记下来。
每个程序都有自己的数据段,代码段。。。
补充:dll有自己的数据段,但没有自己的堆栈。
一个dll,被很多程序调用,为什么代码段共享,数据段不共享?就是因为 内存的COPY ON WRITE 机制
程序1调用这个dll,运行过程中,dll的数据段肯定会改变,那内存就会被COPY一份,原来的依然存在不受影响。
程序2调用这个dll,仍然用的是最开始的数据段,他往里写时再COPY一份,这就保证了两个程序互不影响。
而代码段是一般不会被更改的,所以才来的代码段共享这个概念。
如果用hook等技术,把代码改了,代码同样会被COPY一份之后再改,所以不会影响其它的进程,只会影响你改的进程。
要实现进程1进程2数据共享,只能定义自己的段 ,全局变量和static变量因为内存COPY机制,不会起作用的。
自己的段的定义方法:
#pragma data_seg("share_data_seg")
定义数据(必须初始化)
#pragma data_seg()
或者
#pragma bbs_seg("share_data_seg")
定义数据(不必初始化)
#pragma bbs_seg()
然后定义他的访问机制为rws: 表示具有读,写和共享属性
#pragma comment(linker, "/section: share_data_seg rws")
也可以给工程添加def文件,在里边定义。