所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

linux系统中初始化的全局变量和未初始化过的全局变量保存在哪?

发布时间:2020-04-15 16:40:11

资讯分类:全局变量  linux  初始化  系统  变量  堆栈  局部
linux系统中初始化的全局变量和未初始化过的全局变量保存在哪?

根据变量的不同,变量的存放位置也不同:(仅针对C/C++)

1)全局变量和静态变量:全局、静态变量是事先已经放在固定的内存位置,系统在初始化时,会将全局变量放置在已初始化或未初始化数据段(即.bss和.data段)。全局变量和静态变量只是相对程序的作用域不同,但软件上都理解为一个内存地址,在编译时已经确定。

2)局部变量。局部变量理论上是保存在堆栈中,被调用函数执行时,会先移动堆栈指针,腾出该程序需要的局部变量,因此,局部变量和参数传递可以理解在堆栈中,程序通过堆栈指针加偏移的方式访问 ---- 地址并不固定,仅偏移量固定。因为优化的原因,部分局部变量会放置在寄存器中。

3)对于C++的成员变量。C++的成员变量是相对this指针(关于this本身,Linux和Windows稍有不同)。因此,确切说C++成员变量的存放位置与该类实例有关:即根据类的实现参考见1、2,但在内部表现是一致的,都是this指针加上一固定偏移量。

多数系统,在系统启动时,会将未初始化(.bss)数据段清零,因此,多数全局变量和静态变量初值为0,单局部变量不会,其初值不确定。但正规情况下,所有变量必须初始化


补充话题:

对于多数RISC CPU,CPU在进行运算时实际是不能直接针对内存,即实际CPU是不能直接对全局变量和保存在堆栈之上的局部变量进行运算。这必须通过RISC的Load和Store机制,即CPU需要的变量必须先装在在寄存器,运算完成再放回内存(可以参考:See MIPS run)。

另外,除系统级编程(如访问的数据是在某个外设上,nonecache),程序本身不会理会Cache,Cache只是为了加快程序对内存的访问 ---- 即常规应用下,软件是不知道Cache这件事(当然编译器有些时候因为效率问题要考虑)。

当然这个问题我的理解根本就扯不上什么虚拟地址和Page的关系,与Heap和Stack的分配有一点关系:只是多数malloc和new从heap分配,但并不绝对:您可以重载new。看到扯到Page和缺页中断也是醉了 ----- 把OS一些概念拿来解这个问题也是一种水平,况且不是只有Linux呀,并非所有系统都使用分页概念,还有分段概念呢,也有很多干脆两个概念都不要的,如RTOS。即使分页系统,也未必有处理缺页中断:这是操作系统决定的,Minix就没有,而晒出的那张图是针对Linux这样的分页系统,对于分段系统未必正确。但所有这些和这题有多大关系?

留言与评论(共有 0 条评论)
   
验证码:
Top