虚拟地址空间

image-20220108174749398

Linux会为每一个进程分配4GB的虚拟地址空间

3G-4GB的内核空间中有一个PCB进程控制块,进程控制块有一个文件描述符表,它是一个长度为1024的整型数组,第0-2个位置存放了标准输入,标准输出,标准错误,默认总是打开状态

Linux中的一个进程最多可以打开1024-3个文件

每打开一个文件,就会占用一个文件描述符,而且使用的是空闲的最小的一个文件描述符

例如A进程打开了文件file1,存放在3号位置,再打开一个file2,存放在4号位置,此时关闭file1,在打开一个file3,则会存放在3号位置


image-20220108180431674

0到3GB的内存是用户内存空间

0~4k是不能使用的受保护内存

ELF格式:

.text 是代码段

其他段:只读数据段和符号段等

.data:是已初始化的全局变量,初始化之后是不等于0的

.bss是未初始化全局变量,等于0

堆空间

堆空间是向上分配内存的

共享库

调用的时候加载到这里

栈空间

向下分配内存

命令行参数

1
int main(int argc,char* argv[])

存放main函数参数的值

环境变量

系统中环境变量存放到这里

内核空间

内存管理

进程管理

设备驱动管理

VFS虚拟文件系统

内核空间是受保护的,用户不能对该空间进行读写操作,否则会出现段错误



CPU为什么要使用虚拟地址空间与物理地址空间映射?

1.方便编译器和操作系统安排程序的地址分布

程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区

2.方便进程之间隔离

不同进程使用的虚拟地址彼此隔离,一个进程中的代码无法更改正在由另一进程使用的物理内存

3.方便OS使用内存

程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区.当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为4KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。


虚拟内存只有使用的时候 ,内存才会变少,并不是程序一运行起来就少4个G的空间