Chinaunix首页 | 论坛 | 博客
  • 博客访问: 914838
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-07-23 23:16:07

          虚拟内存管理主要就是管理3GB的用户空间。内核为了管理用户空间主要使用了
两个重要的数据结构,mm_struct和vm_area_struct。mm_struct是对一个进程内存描
述符,对整个进程的内存空间进行描述,进程的地址空间由多个虚存区组成,内核就使
用vm_area_struct是对虚存区进行描述。多个虚存区有两种组织方式(目前知道就两种)
一种是链表,一种是红黑树(基于树的查找,快速定位某个虚寻区)
----------------------------------------------------------------------------------------------
一、mm_struct结构字段分析。
   
  1. struct vm_area_struct * mmap;
mmap是指向组织虚存区(vm_area_struct)的链表,而且是链表的头节点。可以通过该
字段找到虚存区的链表头节点后,遍历该链表,查看进程各个虚存区的情况。

  1. struct rb_root mm_rb;
该字段是虚存区通过红黑树组织的根节点,通过该字段可以使用二叉树遍历的方式遍历
各个虚存区。

  1. int map_count;
这个就是通过进程中有多少个虚存区,也就是vm_area_struct链表有多少个节点。

  1. pgd_t *pgd;
该字段是保存该进程页目录的基地址,每次切换到给进程执行,该值都会被读出,读出后
__pa(pgd)换算成物理地址后写入到CR3寄存器中。进程执行完后该值会从新写入到进程PCB
中的pgd中。
----------------------------------------------------------------------------------------------
二、vm_area_struct结构字段分析。

  1. unsigned long vm_start;
该字段是该虚存区的开始地址。

  1. unsigned long vm_end;
该字段是该虚存区的末尾地址。

  1. struct vm_area_struct *vm_next, *vm_prev;
该字段使用链表组织使用的字段,链表节点的前驱接节点和节点的直接后继。

  1. const struct vm_operations_struct *vm_ops;
该虚存区的“操作集”
---------------------------------------------------------------------------------------------
三,用户空间示意图。

-------------------------------------------------------------------------------------------







阅读(1355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~