概述
7.2.1 代码段&只读数据段
(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)
(2)只读数据段就是程序运行期间只能读不能写的数据,const修饰的常量有可能是存在只读数据段的(但是不一定,const常量的实现方法在不同平台是不一样的)
7.2.2 数据段&bss段
(1)数据段存:1、显式初始化为非0的全局变量;2、显式初始化为非0的static局部变量
(2)bss段存:1、显式初始化为0或者未显式初始化的全局变量;2、显式初始化为0或未显式初始化的static局部变量。
7.2.3 堆
(1)C语言中什么样变量存在堆内存中?C语言不会自动向堆中存放东西,堆的操作是程序员自己手工操作的。程序员根据需求自己判断要不要使用堆内存,用的时候自己申请,自己使用,完了自己释放。
7.2.4文件映射区
(1)文件映射区就是进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个文件,读写完了后在保存时再将内存中的文件写到硬盘中去。
7.2.5 栈
(1)栈内存区,局部变量分配在栈上;函数调用传参过程也会用到栈。
7.2.6内核映射区
(1)内核映射区就是将操作系统内核程序映射到这个区域。
(2)对于Linux中的每一个进程来说,它都以为整个系统中只有它自己和内核而已。它认为内存地址0xc0000000以下都是它自己的活动空间,0xc0000000以上是OS内核的活动空间。
(3)每一个进程都活在自己独立的进程空间中,0-3G的空间每一个进程是不同的(因为用了虚拟地址技术),但是内核是唯一的。
7.2.7 OS下和裸机下C程序加载运行的差异
(1)C语言的程序运行时环境有一定要求,意思是单独个人写的程序没法直接在内存中运行,需要外部一定的协助,这段协助的代码叫加载运行代码(或者叫构建C运行时环境的代码,这一段代码在操作系统下是别人写好的,会自动添加到我们写的程序上,这段代码的主要作用是:给全局变量赋值、清bss段)。
(2)ARM裸机第十六部分,写shell时有一次定义了一个全局变量初始化为0但是实际不为0,后来在裸机的start.s中加了清bss段代码就变0了。这就说明在裸机程序中没人帮我们来做这一段加载运行时代码,要程序员自己做(start.s中的重定位和清bss段就是在做这个事);在操作系统中运行程序时程序员自己不用操心,会自动完成重定位和清bss,所以我们看到的现象:C语言中未初始化的全局变量默认为0…。
(3)数据段的全局变量或静态局部变量都是有非0的初值的,这些初值在main函数运行之前就已经被初始化了,是重定位期间完成的初始化。
最后
以上就是幸福战斗机为你收集整理的7-2Linux下C程序的内存映像的全部内容,希望文章能够帮你解决7-2Linux下C程序的内存映像所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复