2

我试图了解 C 如何将内存分配给全局变量。

我正在研究一个简单的内核。到目前为止,除了打印到屏幕和启用中断之外,它不能做更多的事情。我现在正在开发一个基本的物理内存管理器。

我的内存管理器是一个位图,如果内存已分配或可用,则设置为 1 或 0。我需要将我的内核正在使用的内存作为“已分配”添加到位图中,因此没有任何内容会覆盖它。

我可以很容易地找到内核的开始,因为它被静态加载到 0x100000。弄清楚长度也不应该太难。我不确定的部分是全局变量在内存中的位置?

假设我的内核是 12K,然后我可以将这些 3x 4K 内存块分配给它以进行保护。我需要分配更多来覆盖它使用的变量吗?或者变量是 12K 的一部分?

谢谢你的帮助,我希望我有足够的意义。

4

3 回答 3

2

看一下

http://www.geeksforgeeks.org/archives/14268

你的全局变量大多在 BSS 中

于 2012-06-25T02:13:22.570 回答
1

正如前面的答案所说,大多数变量都存储在 .bss 部分中,但它们也可以存储在 .data 或 .rodata 部分中,具体取决于您将全局变量定义为 static 还是 const。编译后,您可以使用 readelf -S kernel.bin 查看每个部分将使用多少空间。对于 .bss 部分,仅当二进制文件加载到内存中时才会占用内存,并且不占用磁盘空间。这意味着您编译的内核二进制文件将小于它稍后放入内存时使用的实际大小(通常通过 grub)。

除了使用 readelf 之外,确定内核将使用多少数据的简单方法是将 .bss 部分放在链接描述文件的 .data 部分中。然后内核二进制文件的大小在磁盘上和内存中的大小相同(或者实际上它在内存中会小一点,因为并非所有部分都被 grub 复制)但是至少你知道你的最小内存量需要分配。

于 2012-06-26T12:55:04.523 回答
0

我建议使用自定义链接器脚本(假设您使用gcc):它使内核部分的布局明确且可定制(要了解有关链接器脚本的更多信息,请阅读info ld)。您可以在此处查看我的操作系统链接器脚本的示例。

要查看默认链接描述文件,请使用-v/--verbose选项ld

大部分全局变量位于.data.*.rodata.*节中,用 0 初始化的变量进入.bss.

于 2012-12-07T17:26:46.130 回答