我从her那里读到了 “可执行文件的BSS段不存储在磁盘上,内核将零页面映射到BSS地址范围。” 有人可以提供有关这里发生的事情的详细答案吗?
答案 0 :(得分:11)
“可执行文件的BSS段未存储在磁盘上”
因为在创建新进程时期望BSS段被初始化为零,并且只是在可执行文件中存储一堆零会浪费空间,所以可执行文件只是指示BSS段应该从哪里开始以及它应该有多大是
“并且内核将零页面映射到BSS范围。”
当内核从可执行文件构建新进程时,它会创建BSS范围到零页面的映射,该页面是所有零的静态(虚拟)页面。映射将在其上设置写时复制,因此第一次新进程写入其中一个BSS页面时,静态零页面的真实副本将在允许写入完成之前在另一个内存页面中分配
这样(a)节省了可执行文件中的空间,并且(b)避免实际分配可能永远不会被进程触及的BSS页面,从而节省了内存使用量,同时仍然保证每个进程中的BSS段看起来都是根据需要进行零初始化。