我当时正在研究OS基础知识的测试,这在我脑海中浮现。当我在C程序中声明全局(或静态)变量时,如下所示:

char* msg = "Hello World!\n";

.data中保留一个字节数组,并将"Hello World!\n"字符串保存在.text中,然后在将程序加载到内存并开始执行时,使用保存在msg中的字符串初始化.text var。这会发生什么吗?那么,在.data中保留字节而不是在堆中保留字节之间的区别是什么?我知道在.data中它们的大小是静态的,但是它们也可以保留在堆中,对吗?为什么这些东西分开?在过程镜像中仅包含堆,堆栈和代码部分,而不是更多部分,不是更有效吗?不可能是因为物理内存被映射到多个虚拟地址(例如记事本的多个实例),因为这些变量是可编辑的。

先感谢您

最佳答案

该编译器的作用是使此(常量)文字成为读/写变量。

编译器以.text收集所有文字字符串。当在程序中多次使用文字字符串时,它将仅使用一次.text中的文字。

在启动时,它将其复制到.data中的保留空间。这很好笑:

char msg[] = "Hello World!\n";
char *msg  = "Hello World!\n";

编译器将第一个文字从.text复制到.data是可以的;它正在按照用户说明初始化变量。

编译器将第二个文字复制到.data是不正确的:它应该已经初始化*msg,并且指向.text中的文字,并且.text段应设为只读(由内存硬件管理,当内存为尝试写入)。

10-01 00:07
查看更多