首先,对于32位机器而言,每个程序运行起来,os会给程序提供4G的可操作空间,但并非就是硬盘少了4G,而是程序可以操作4G,具体使用多少视具体使用情况而言,其他未用到的仍然空闲放在那里!
下面看一下4G虚拟地址的具体分配情况:

1、指向NULL的指针:此时该指针放在受保护地址段(0~4K),指针无法正规操作,所以要想使用指针,指针必须具有明确的指向。
2、ELF段(Executable and Linkable Format):是Linux下用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
ELF段包括: .bss、.data、.text三个小区段
.text: 代码段,用于存放代码,代码在此段中的存储采用绝对位置的存放方式,因此不需要知道偏移量
3、共享库:用于存放C标准库函数和Linux系统IO函数,函数在此段中的存放按照相对位置存放,因此每次需要根据偏移量去对应位置取出函数,因此在生成动态库时,必须与位置无关。
二、1G的Linux内核空间

在Linux内核中,有一个很重要的概念就是PCB(进程控制块),在PCB中会有一个文件描述符,文件描述符其实就是一个整形数组,表示空间为0~1023,默认开启一个程序后,默认打开的有三个描述符:stdin、stdout、stderr,程序每打开一个文件就会占用一个文件描述符,一个程序最大可以打开的文件数为1024个,用户可以打开的文件为1021个,因为默认会占用三个。
注:每打开一个新文件,则占用一个文件描述符,而且使用的是空闲描述符中序号最小的一个。
三、为什么需要虚拟地址空间?***

来源:https://blog.csdn.net/weixin_42067873/article/details/98942323