9,513
社区成员
发帖
与我相关
我的任务
分享
http://hi.baidu.com/vfdff/item/067f07d9961be32938f6f7ae
写时复制页面保护机制是一种优化,内存管理器利用它可以节约内存.
写时复制的一个应用是:在调试器中实现断点支持。例如:在默认情况下,代码页面在起始时都是只能执行的(即:只读的),然而,如果一个程序员在调试一个程序时设置了一个断点,则调试器必须在代码中加入一条断点指令。它是这样做的:首先将该页面的保护模式改变为PAGE_EXECUTE_READWRITE,然后改变指令流。因为代码页面是所映射的内存区的一部分,所以内存管理器为设置了断点的那个进程创建一份私有拷贝,同时其它进程仍然使用原先未经修改的代码页面。
写时复制是“延迟计算(lazy evaluation)”这一计算技术(evaluation technique)的一个例子,内存管理器广泛地使用了延迟计算的技术。延迟计算使得只有当绝对需要时才执行一个昂贵的操作——如果该操作从来也不需要的话,则它不会浪费任何一点时间。f.c
int x=0;
int inc()
{
x++;
return x;
}
汇编代码为
ff 05 00 00 00 00 incl 0x0
1.这个动态链接库中有一个全局变量,
2.当某个应用加载该库时,要对该变量重定位;并且多个应用加载该库时,库的加载起始地址可能不一致。
3.要对不同的地址空间中的这个变量进行重定位,自然要修改引用了该全局变量的代码页,内核会COW,那么每个进程就有了该页的一个副本.
1。全局变量在共享库的数据段
2。数据段共享是COW方式
3。全局变量毕竟是变量,可以在进程的运行过程中被修改,因此每个进程应当有不同的copy,因此COW是合理的。
4。如果是全局常量,则在代码段,对所有进程都是可见的,代码段只是只读共享,没有COW.
详见:
http://sheepxxyz.blog.163.com/blog/static/61116213200911101412711/
http://wildpointer.net/2010/11/28/dl-do-not-share-global-variable/comment-page-1/#comment-2534
具体做法:将函数开头几个字节的内容修改为一个跳转 语句