部分bss并将它们加载到内存中

时间:2016-09-05 22:50:41

标签: x86 operating-system elf

这里写着https://web.stanford.edu/~ouster/cgi-bin/cs140-winter16/pintos/pintos_6.html

  

main()的第一步是调用bss_init(),它清除了   kernel的“BSS”,这是一个段的传统名称   应该初始化为全零。在大多数C实现中,   无论何时在函数外声明变量而不提供   初始化器,该变量进入BSS。 因为这就是全部   零,BSS不存储在加载器带入的图像中   记忆。我们只使用memset()将其归零

我突出了一个我不理解的部分。为什么bss部分“等于0”会导致这种行为?当且仅当它是一般性的而非依赖于实现的时候,这个问题才有意义。

1 个答案:

答案 0 :(得分:2)

不是存储全零的N个字节,而是为BSS存储的所有内容都是长度。

将BSS与数据部分分开的全部意义是节省空间。所以不会导致行为,启用它。

您可以将其视为可以使用零初始化的所有内容的行程编码。

  

那么,我们将什么归零?

我们在加载需要N字节BSS的图像时分配的内存。

请注意,在非玩具操作系统中,所有BSS页面通常都会开始写入映射到零的单个物理页面(共享系统范围)的写入时复制。当一个进程弄脏这样一个页面时,它会触发一个" minor"页面错误,内核为它提供了一个私有的归零页面作为现在脏的虚拟页面的支持。 (并且从次要故障返回时,第一次成功执行故障的存储指令,导致TLB未命中读取新更新的页表。)