linux内核设计与实现读书笔记——进程的地址空间

进程的地址空间:由进程可寻址的虚拟内存组成(一般采用平坦地址空间,也有采用段地址空间 )

内存区域:可被进程访问的合法地址,可以包含代码段、数据段、未初始化全局变量内存映射(bss段零页),进程用户空间栈内存映射,共享内存段、内存映射文件、匿名内存映射等内存对象。

内存描述符:描述进程的地址空间,mm_struct定义在中,包括内存对象的地址、使用该地址的进程、页表等信息,自身链接在双向链表中。首元素init_mm内存描述符,代表init进程的地址空间,操作时使用mmlist_lock锁防治并发。task_struct结构体mm存放内存描述符。

分配内存描述符:复制父进程的内存描述符,结构体由fork.c中从slab缓存分配。(对于线程设置clone标志来共享内存,不需要分配结构体,至真直接指向接口)

撤销内存描述符:进程退出时exit_mm

ps:内核线程没有地址空间,因此进程描述符中的mm为空,使用前一个进程的内存描述符,使用前一个进程的页表。


虚拟内存区域VMAs

vm_area_struct结构体描述,定义在zhong,代表不同类型的内存区域。每个内存区域作为单独的内存对象管理,拥有一致的属性和操作。

VMA操作:将制定内存区域加入或从地址空间中删除等。

内存描述符中通过mmap和mm_rb访问内存区域对象。是两种vm_area_struct结构体智商真不同的组织方式,链表按地址增长方向排序,适合便利;红黑树方式适合查找。


工具:

通过/proc//maps查看给定进程的内存空间和所含内存区域


内存区域操作:

 给定内存地址找到内存区域find_vma

创建地址区间:mmap 将新的地址区间加入进程的地址空间(扩展或者创建新区域)对于新分配的内存区域,需要添加到内存区域链表和红黑树中,更新内存描述符中的相关域,返回初始地址。

删除地址空间:munmap


reference 

http://soft.chinabyte.com/os/51/12324551.shtml

http://blog.csdn.net/hjl243632044/article/details/7218283



你可能感兴趣的:(linux内核设计与实现读书笔记——进程的地址空间)