进程4G虚拟内存空间的分配

通常我们常说的4G/8G内存是指计算机硬件的内存条是4G/8G,而不是我们今天所谈论的进程4G虚拟的内存。
当一个程序运行时,系统会为每一个进程分配一个4G的虚拟内存空间,用来保存进程运行所需要的各种资源(详细资源列表后面会谈到),并创建task_struct进程控制块,保存进程的属性(进程ID、父进程、进程状态、使用的寄存器等)。
接下来聊一聊4G的虚拟内存是如何分配的:
4G------------- |-----
内核空间 | 特点是由内核管理,用户是不可见的更是进不去的
3G------------- |-----
用户空间 | 特点是由用户管理
0-------------- |------
用户空间的0~3G分为:
3G |----------------------------------|
^ | 栈区 | ------>特点是由系统管理,先进后出,存放的是局部变量,函数形参,自动变量;
|| |----------------------------------|
|| | 堆区 | ------>特点是由用户管理,用户可以使用的malloc申请的空间就是这片空间;
|| |----------------------------------|
|| | 未初始化区域 | ------>保存的是未初始化的全局变量
|| |-----------------------------------|
|| | 全局/静态初始化区域 | ------>保存了初始化的全局变量还有static修饰的变量
|| |---------------------------------- |
|| | 字符串常量 | ------>保存了常量
|| |-----------------------------------|
^ | 代码区 | ------>存放源代码
0 |----------------------------------|

内核空间的3G~4G分为:
4G |----------------------------------|
| 保留分区4K | ------>用于错误码的判断
|| |----------------------------------|
|| | 专业内存映射区 | ------>给内核使用的我们无需关心
|| |----------------------------------|
|| | 高端内存映射区 | ------>896M~4G/8G(依据内存条空间而定)
|| |-----------------------------------|
|| | vmalloc区 | ------>驱动程序中vmalloc函数申请的空间
|| |---------------------------------- |
| 直接物理地址映射 | ------>直接物理地址的映射仅896M
3G |---------------------------------- |

最后谈一谈几个关于地址的概念:
物理地址:硬件芯片手册上的地址是实际的物理地址;
虚拟地址:4G虚拟空间的地址,上面所讲述的都是虚拟地址;
线性地址:在ARM架构中,线性地址与虚拟地址是相同;
逻辑地址:反汇编程序中我们能看到的地址是逻辑地址;
相对地址:相对于某一个地址来说的;

你可能感兴趣的:(Linux驱动,C语言,linux,进程,虚拟内存)