文章目录
- 进程的地址空间划分
- 用户空间
- 内核空间
- 程序的链接原理
进程的地址空间划分
任何的编程语言=》产生两种东西:指令和数据
程序加载到内存中,不可能加载到物理内存。
linux系统会给当前进程分配一个2^32(32位系统,4G)大小的一块空间(进程的虚拟地址空间)
用户空间
1、.test
: 只读
代码生成指令时,指令的内存放在代码段中(.test段)
int main()
{
int a = 12; // 生成一条汇编指令 mov dword ptr[a]. 0Ch
int b = 0;
int c; // 这时打印他为无效值
}
所以局部变量代码经过编译后生成的是指令,放在.text段中。
在这条指令运行的时候,根据指令去栈中开辟内存。
.rodata
: 只读数据段
char *p = "hello world"; // 不能修改*p
现在编译器都不让普通的指针指向常量字符串,应该这么写:
const char *p = "hello world";
其中"hello world"存放在.rodata
中,因为.rodata
只读,所以不能修改*p。
2、.data
:存放已经初始化了的值(不为0的)
int gdata1 = 10;
static int gdata2 = 20;
```cpp
int main()
{
int static e = 12; // 放在.data段
int static f = 0; // 放在.data段
int static g; // 放在.bss段 这时打印他为0
}
因为static在程序启动时不会初始化,等到程序运行到static
3、.bss
:给未初始化的量默认值(0)。
内核自动负责将.bss段的值全部修改为0.
int gdata1 = 0;
int gdata2;
static int gdata3 = 0;
static int gdata4;
4、.heap
:从上往下增长
5、动态链接库 *.dll * so
6、.stack
:从下往上增长
7、命令行参数和环境变量
./a.ou 192.168.1.100
内核空间
ZONE_DMA
ZONE_NORMAL
ZONE_HIGHMEN
程序的链接原理
编译完成的所有.o文件+静态库文件