数据的内部存储:
大端:低地址存高位数
小端:高地址存高位数
代码段:
一个程序多数情况下是不需要更改自身代码的,只有一种情况例外,就是一些长时间运行的升级程序。(另一种解决方案为采用共享库的形式)。
数据段:
包含程序中明确给定初值的全局变量和静态变量。
缓冲段:
通常是没有明确给定初值的全局变量和静态变量。
栈:
所有的自动变量和函数调用时所需要保存的信息(返回地址,函数调用前个寄存器的值等)都存储在栈上。
栈随着函数的调用而生长,随着函数调用结束而消亡。
自动变量的3种存储方式:
存储在数据段(给定初始值的全局变量和静态变量)或者bass段(没给定初值的全局变量和静态变量,静态局部变量);
存储在寄存器(寄存器变量)
存储在栈中(一般变量,如局部变量)
注意:c语言编程中,一种典型的错误就是将一个指向局部变量的指针作为函数的返回值返回。
堆
堆用于存储用户申请的内存空间,通常在堆中进行动态内存分配。
操作系统为程序分配的是虚拟地址,而不是物理地址。
操作系统的内存分页管理机制:首先我们知道,每个动态运行的程序就是进程,操作系统为每个进程维护了一个页表。页表给出了该进程的每一页对应的帧的位置。页表记录了这个进程的很多页,很多页构成了这个进程,将这个进程分成很多页的作用就是能够在物理内存上可以不连续存储,但在逻辑上是连续连续存储。对应的,一个进程被分为很多页,内存地址被分为很多帧。这样,根据给出的逻辑地址(页号和偏移量)通过处理器产生物理地址(帧号和偏移量)。
常量的存储
如“c”,1234,这些简单常量,是存储在程序的代码段中 。
但是对于“aasdfmaaf”这种太长的字符串,会将其存储在。rodata段中,但在该段的地址会转换为一个简单变量存储在程序的代码段中。
总结:
栈是动态的,存储的一般是一些自动变量,会调用函数,并且会消长。
堆是动态分配的内存,但分配到的内存地址为虚拟地址。
.data段存储被初始化后的静态变量和全局变量。
.bass段通常存储未被初始化的静态变量和全局变量。
代码段存储的是指令集和一些常量。
linux--环境变量(linux进程内存管理)
最新推荐文章于 2023-08-06 14:11:29 发布