搜索
您的当前位置:首页正文

linux系统编程之基础必备(五):Linux进程地址空间和虚拟内存

来源:易榕旅网

一、虚拟内存

先来看一张图(来自《Linux内核完全剖析》),如下:
 

分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL就会与段的特权级进行比较,以确定是否有权限访问。每个特权级都有自己的程序栈,当程序从一个特权级切换到另一个特权级上执行时,堆栈段也随之改换到新级别的堆栈中。

 

 C++ Code 










10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 

 

 

 

 

将其更加详细地展示如下:

 

程序路径:完整的绝对路径字符串如 “/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);均在这里分配。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top