一.存储器模型
C6000编译器把整个存储区当作单个线性存储块,并将其分配为代码区和数据区,一个C程序产生的代码和数据被放在各自连续的存储空间中,编译器假定存储器的32位地址空间都是可用的,但需要注意的是,连接器才是最终决定存储器映像(定义存储器映像并将代码和数据分配到目标存储器的是连接器,)编译器不对可用的存储器作任何假设,也不关心哪个地址不能被代码或者数据占用,以用哪些地址是保留给I/O设备或控制寄存器。
编译器生成的可重定位的代码块和数据块称为段,系统设置不同,段分配到存储器的方式也不同,c6000编译器产生如下几个段:
已初始化段,包含数据和执行代码
(1).cinit段:包含变量初始值和常量值.
(2).const段:包括字符串文字,浮点常量和在程序中被声明为const的数据(如果常量没有同时被声明为volatile
(3).switch段:包含switch语句的跳转表
(4).text段:默认的包含所有的可执行的代码
未初始化段:存储器中的保留空间,程序在运行时用它来创建和存储变量。C/C++编译器生成的未初始化段:
(1).bss: 为全局变量和静态变量保留,如果为连接器设置了-c选项,则在程序开始时,C引导程序(c_int00)会将.cinit段的数据复制到bss段中,编译器会定义全局符号$bss,并指定其为.bss段的起始地址.
(2).far段:为声明为far的全局变量和静态变量保留
(3).stack段:系统栈,这个存储区用于传递参数和为局部变量分配存储空间.
(4).system段:为动态存储空间分配保留的存储区,提请动态空间分配要求的函数有:malloc calloc,和realloc等等,如果程序中没有用这些函数,编译器不生成此段