记得我们以前写汇编程序的时候总是要把程序分成代码段、数据段、堆栈段,现在回想,应该是为了提高汇编器的汇编效率,提前分配好在ROM各段的存储。
类似的我们可以判断在C程序编译之后生成的二进制文件中,已经包含了各个段的信息,方便我们在程序运行的时候获取。
这个二进制文件即我们通常意义上讲的ROM,说得明白些其实是将程序代码烧录到flash memory中,因为最原始的存储代码的介质是ROM,所以习惯将代码的二进制文件叫做ROM文件。
运行期间C程序可以看做由下列部分组成:
1)代码段——CPU执行的机器指令部分。
2)数据段——在程序中所有的静态变量(全局变量从某种意义上说也是静态变量,作用范围为全局),存放在这里。
3)栈——自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
4)堆——动态存储部分。
5)只读常量区——不允许修改的数据存放区域(如char*p = "helloworld"、const修饰的变量)。
代码段的载入并不是一次性的,OS有它自己的设计,而我们讨论内存占用的时候很大一部分是在讨论的是数据段和堆栈段的存储问题。
以上分析,如有异议,欢迎讨论。