任何编程语言->产生指令和数据
我们以x86 32位linux 作为知识介绍的背景
编译后生成exe
文件在磁盘上,需要加载到内存才能运行
但不能直接加载到物理内存
linux给当前进程分配一个2^32大小的一块空间,4G
虚拟地址空间解释
- 它存在,你看得见,它是物理的
- 它存在,你看不见,它是透明的
- 它不存在,你看得见,它是虚拟的
- 它不存在,你看不见,它是被删除了
进程虚拟地址空间
.text
是代码段,.rodata
是只读数据段,存放如字符常量相关的数据,如
char *p = "hello world";
*p = 'a'; // error
stack
是高地址向低地址生长,heap
是低地址向高地址生长
zone_normal
存pcb
(进程控制块)块,内核函数所依赖的栈空间
举个例子,理解数据存在进程虚拟地址空间的哪一部分:
#include "pch.h"
#include <iostream>
using namespace std;
int gdata1 = 10; // .data段,已初始化且不为0
int gdata2 = 0; // .bss段,初始化但为0
int gdata3; // .bss段
static int gdata4 = 11; // .data段,已初始化且不为0
static int gdata5 = 0; // .bss段
static int gdata6; // .bss段
int main()
{
// 下面三行代码是指令mov,不产生负号,存放在.text段
int a = 12; // mov dword ptr[a], 0Ch 分4字节空间将12存入其中
int b = 0;
int c;
static int e = 13; // .data段
static int f = 0; // .bss段
static int g; // .bss段
return 0; // .text段
}
每一个进程的用户空间是私有的,但内核空间是共享的
这也就引出了进程间通信方式中的 匿名管道通信,也就是在内核空间开了一块共享内存