请教高手,linux C GNU,.bss与.data段的区别是.bss段是不占存储空间,原理是怎样的,应该怎么理解??

来源:百度知道 编辑:UC知道 时间:2024/09/19 16:31:15

在linux下 需要加载一个可执行程序到内存时会调用exec函数 exec函数会读取可执行文件的头部信息 其中就包括各段(code data bss)的起始地址和结束地址 因为bss时未初始化的数据段 exec函数就会把bss段【起始地址-结束地址】映射到一个全0的页(叫什么名字我忘记了 反正linux有专门的这么一页内存4K,所以程序(不只你的程序)未初始化的数据都映射到此页),至于linux为什么要这样,其实你可以自己想想,你未初始化一个数据(好比你定义一个 Int a (全局的 或 静态的)) 你以后可能不会再程序中用它(因为你编程失误) 这样因为没有跟它分配内存(而只是映射了一下) 所以不会浪费宝贵的内存 如果以后再程序中用到此变量 如果是读则是0(此映射不会变) 但是如果你写此变量 他就会分配一页内存存放你的bss段(this is call copyonwite)
,并且将此页全清零 好了 不说了 我也是菜鸟