进程虚拟地址空间区域的划分
任何编程语言 -> 产生两种东西:指令和数据
所以我们了解指令和数据的存放方式是很有必要的!
进程的虚拟空间划分
环境
x86 32位linux环境下,系统给进程分配一个4G的虚拟地址空间
(64位下,可以参考:https://blog.csdn.net/qq_28018113/article/details/73438094)
示例图
各个段的说明
-
.text 指令段 只读
-
.rodata 只读数据段 char* p =“hello” hello 就在rodata
-
.data 数据段 初始化了的数据,且初始值不为零
-
.bss 数据段 未初始化的数据,或初始化为零的数据,系统会给这个段进行零初始化。存储未初始化的全局变量 (不占用程序文件的大小,但是占用程序运行时的内存空间)
-
heap 堆 分配时从低地址到高地址
-
stack 栈 每个线程在当前进程空间中都会有私有的栈空间。地址空间从高地址到低地址增长
-
命令行参数 ./a.out 127.0.0.1 6000
-
ZONE_DMA 大概16M
-
ZONE_NORMAL 800多M 有进程控制块PCB 内核栈空间
-
ZONE_HIGHMEM 高端内存
-
!全局变量会在符号表中生成符号
-
!局部变量不生产符号,生成指令 存放在.text
- int a = 12; mov dword ptr[a], 0Ch
-
!局部静态变量存放在数据段,按照是否初始化,是否为零分开存放。当程序运行到static int e = 13; 时才初始化。
示例代码
#include<iostream>
int gdata1 = 10
int gdata2 = 0;
int gdata3;
static int gdata4 = 11;
static int gdata5 = 0;
static int gdata6;
int main()
{
int a = 12;
int b = 0;
int c;
static int e = 13;
static int f = 0;
static int g;
return 0;
}
数据类型 | 存放区域 | 举例变量 |
---|---|---|
全局变量已初始化且不为零 | .data | gdata1 |
全局变量已初始化且为零 | .bss | gdata2 |
全局变量未初始化 | .bss | gdata3 |
全局静态变量已初始化且不为零 | .data | gdata4 |
全局静态变量已初始化且为零 | .bss | gdata5 |
全局静态变量未初始化 | .bss | gdata6 |
局部变量 | 产生指令放在.text | a,b,c |
局部静态变量已初始化且不为零 | .data | e |
局部静态变量已初始化且为零 | .bss | f |
局部未初始化静态变量 | .bss | g |