一、虚拟内存
先来看一张图(来自《Linux内核完全剖析》),如下:
分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比较,以确定是否有权限访问。每个特权级都有自己的程序栈,当程序从一个特权级切换到另一个特权级上执行时,堆栈段也随之改换到新级别的堆栈中。
C++ Code
1 |
将其更加详细地展示如下:
程序路径:完整的绝对路径字符串如 “/home/simba/code/asm/simple”
环境变量:类似linux下的PATH,HOME等的环境变量,子进程会继承父进程的环境变量。
命令行参数:类似ls -l 中-l 就是命令行参数,而ls 就是可执行程序。
对于函数栈来说,函数运行完毕就释放内存,举例递归来说,一直开辟向下函数栈,然后由下往上收复,所以递归太多层的话很可能造成栈溢出。
局部变量(不包含静态变量);局部可读变量(const)都分配在栈上。
堆:即malloc申请的内存,使用free释放,如果没有主动释放,在进程运行结束时也会被释放。
Text Segment: 可执行程序(二进制)(.text);全局初始化只读变量(const)(.rodata);字符串常量(.rodata);均在这里分配。
Data Segment: 全局变量(初始化的在.data,未初始化的在.bss);静态变量(全局和局部)(初始化的在.data,未初始化的在.bss);全局未初始化只读变量(.bss);均在这里分配。
因篇幅问题不能全部显示,请点此查看更多更全内容