理解 so 的机制
进程内存空间分成代码段(code),数据段(data),堆(heap), 栈(stack), 考虑加载 .so,进程空间应该不只一份 code 和 data segment)
static 变量保存可执行文件或 so 的数据段(data segement) 中,并且有初始值
编译程序在在 link 的时候,为 static 分配地址到数据段,当so被 load 的时候,应该是直接把so 用物理内存映射的放到load进程地址空间,用户可以直接读取 static 变量;但当用户改写此 static 变量的时候,操作系统会重新分配物理内存并映射,原来 static 变量使用的进程地址并不改变, 这就是 copy on write, 看下面的摘要:
Shared libraries are loaded into a process by memory-mapping the file into some portion of the process's address-space. When multiple processes load the same library, the OS simply lets them share the same physical RAM.