以32位系统为例,Linux将地址空间3:1划分给系统和用户,用户占0-3GB,系统占3-4GB。
用户空间,被划分为segments:
____
|____| 栈:存放函数过程的变量,向下增长↓
|____| 堆和栈中间是一块mmap映射出来的大小不确定的地址空间
|____| 堆:存放动态分配的数据,向上增长↑
|____| bss段:存储未初始化的全局变量
|____| data段:存储已初始化的全局变量
|____| text段:包含当前运行进程的二进制码
Linux中每个段用一个vma结构体表示,段和段用双线链表连接。vma本身由红黑树组织,查找的复杂度是logn(链表是n)。
进程是如何查找vma的:大概是先找一个cache,没命中再去红黑树找
内核空间
____
|____| vector
|____| vmalloc area,用vmalloc()分配,只能保证在虚拟地址上是连续的
|____| 普通内存,使用kmalloc()分配,分配到的物理地址是连续的
|____| bss段:存储未初始化的全局变量
|____| data段:存储已初始化的全局变量
|____| text段:包含当前运行进程的二进制码
补充:物理地址连续与不连续的优劣---连续的话更好地利用了局部性原理,效率更高,因此如果不是大段的内存,尽量用连续的就好