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

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

内存区域:可被进程访问的合法地址,可以包含代码段、数据段、未初始化全局变量内存映射(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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值