这里写着https://web.stanford.edu/~ouster/cgi-bin/cs140-winter16/pintos/pintos_6.html:
main()的第一步是调用bss_init(),它清除了 kernel的“BSS”,这是一个段的传统名称 应该初始化为全零。在大多数C实现中, 无论何时在函数外声明变量而不提供 初始化器,该变量进入BSS。 因为这就是全部 零,BSS不存储在加载器带入的图像中 记忆。我们只使用memset()将其归零。
我突出了一个我不理解的部分。为什么bss部分“等于0”会导致这种行为?当且仅当它是一般性的而非依赖于实现的时候,这个问题才有意义。
答案 0 :(得分:2)
不是存储全零的N个字节,而是为BSS存储的所有内容都是长度。
将BSS与数据部分分开的全部意义是节省空间。所以它不会导致行为,启用它。
您可以将其视为可以使用零初始化的所有内容的行程编码。
那么,我们将什么归零?
我们在加载需要N字节BSS的图像时分配的内存。
请注意,在非玩具操作系统中,所有BSS页面通常都会开始写入映射到零的单个物理页面(共享系统范围)的写入时复制。当一个进程弄脏这样一个页面时,它会触发一个" minor"页面错误,内核为它提供了一个私有的归零页面作为现在脏的虚拟页面的支持。 (并且从次要故障返回时,第一次成功执行故障的存储指令,导致TLB未命中读取新更新的页表。)