五分钟搞定bss、data和rodata的区别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五分钟搞定bss、data和rodata的区别
对于嵌入式工程师来说,对于内存,链接文件的了解是非常重要的,了解这些知识有利于你对优化程序的运行时间和程序占用空间,下面们来聊一聊内存中bss,d ata,rodata,text等概念,
bss(bloc k started by sy mbol)
bss是指那些没有初始化的和初始化为0的全局变量和静态变量,bss 类型的全局变量只占运行时内存空间,而不占文件空间,另外在程序初始化时,通常会把bss全局变量全部清零。
为了保证程序的可移植性,编写代码时手动初始化为0是一个好习惯。
data
与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据。
当然,如果数据全是零,为了优化考虑,编译器把它当作bss处理。
通俗的说,data指那些初始化过(非零)的非const的全局变量和静态变量。
由此可见,data类型的全局变量是即占文件空间,又占用运行时内存空间的。
rodata(rea d only data)
rodata的意义同样明显,ro代表readonl y,即只读数据(const)。
只读数据段,存放常量,字符常量。
关于roda ta类型的数据,要注意以下几点:
常量不一定就放在ro data里,有的立即数直接编码在指令里,存放在代码段(.text)中。
rodata是在多个进程间是共享的,这可以提高空间利用率。
在有的嵌入式系统中,rodata放在ROM(如nor flash)里,运行时直接读取ROM内存,无需要加载到RAM内存中。
由此可见,把在运行过程中不会改变的数据设为rodata类型的,是有很多好处的:在多个进程间共享,可以大大提高空间利用率,甚至不占用RAM空间。
同时由于rodata在只读的内存页面(pa ge)中,是受保护的,任何试图对它的修改都会被及时发现,这可以帮助提高程序的稳定性。
tex t
通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。