进程的地址空间:由进程可寻址的虚拟内存组成(一般采用平坦地址空间,也有采用段地址空间 )
内存区域:可被进程访问的合法地址,可以包含代码段、数据段、未初始化全局变量内存映射(bss段零页),进程用户空间栈内存映射,共享内存段、内存映射文件、匿名内存映射等内存对象。
内存描述符:描述进程的地址空间,mm_struct定义在<linux/sched.h>中,包括内存对象的地址、使用该地址的进程、页表等信息,自身链接在双向链表中。首元素init_mm内存描述符,代表init进程的地址空间,操作时使用mmlist_lock锁防治并发。task_struct结构体mm存放内存描述符。
分配内存描述符:复制父进程的内存描述符,结构体由fork.c中从slab缓存分配。(对于线程设置clone标志来共享内存,不需要分配结构体,至真直接指向接口)
撤销内存描述符:进程退出时exit_mm
ps:内核线程没有地址空间,因此进程描述符中的mm为空,使用前一个进程的内存描述符,使用前一个进程的页表。
虚拟内存区域VMAs
vm_area_struct结构体描述,定义在<linux/mm_types>zhong,代表不同类型的内存区域。每个内存区域作为单独的内存对象管理,拥有一致的属性和操作。
VMA操作:将制定内存区域加入或从地址空间中删除等。
内存描述符中通过mmap和mm_rb访问内存区域对象。是两种vm_area_struct结构体智商真不同的组织方式,链表按地址增长方向排序,适合便利;红黑树方式适合查找。
工具:
通过/proc/<pid>/maps查看给定进程的内存空间和所含内存区域
内存区域操作:
给定内存地址找到内存区域find_vma
创建地址区间:mmap 将新的地址区间加入进程的地址空间(扩展或者创建新区域)对于新分配的内存区域,需要添加到内存区域链表和红黑树中,更新内存描述符中的相关域,返回初始地址。
删除地址空间:munmap
reference
http://soft.chinabyte.com/os/51/12324551.shtml
http://blog.csdn.net/hjl243632044/article/details/7218283