Linux下每个进程都有一个虚拟内存空间,32系统下一般是 4G大小。
其中包括:
从高地址到低地址来讲分别有以下几种:
整体上可以分为两种,内核区以及用户区,
- 内核区中是一些用户代码不可见的区域,比如页表就存放在这个区域。
- 用户区中从上到下分别是:
a. 代码段: 可读不可写
b. 数据段: 全局变量以及静态变量存放的区域
c. 堆区: 动态内存,通过malloc, new 申请内存。
d. 文件映射区域: 通过mmap系统调用,比如共享内存等映射物理空间的内存区域。
e. 栈区:维护函数调用的上下文空间
拓展知识:
3.
64位操作系统中虚拟空间大小一般是2^48, 并不需要64位大的地址空间,会造成资源浪费,256TB的寻址空间。
4.
进程之间共享内存方式有两种:shm与mmap。
shm:多个进程的虚拟地址直接共享同一块物理内存区域,访问速度快,大小受限制
mmap:多个进程的虚拟地址空间共享同一块磁盘空间,空间大,访问速度慢
mmap是一种内存映射方法,将物理文件或者对象映射到进程中的虚拟地址空间中一段虚拟地址。
mmap调用过程:
用户态调用mmap之后创建一个虚拟内存区域,内核态调用mmap创建磁盘空间到虚拟地址之间的映射,并建立页表。进程发起对映射空间的访问,引发缺页异常,将文件内容拷贝到物理内存。
5.
函数调用上下文空空间包括: 局部变量,函数参数,当前状态,函数调用信息。 栈空间向地址减少的方向增长。
函数调用过程使用的是堆栈实现,每个用户态进程对应一个调用栈,编译器使用它传递函数参数,保存返回地址,临时保存寄存器原有值以及从存储本地局部变量
(页表基址寄存器)