首页 百科知识 虚拟内存的管理

虚拟内存的管理

时间:2024-10-09 百科知识 版权反馈
【摘要】:所有进程从3GB到4GB-1的虚拟空间都是一样的,Linux以此方式让内核态进程共享代码段和数据段。进程的可执行映像映射到虚拟内存的用户空间。进程虚拟内存的内核空间的访问权限设置为0级,用户空间为3级。Linux的存储管理主要是管理进程虚拟内存的用户区。Linux在管理进程虚存空间时定义了虚存段。系统以虚拟内存地址的降序排列vm_area_struct结构。链表的首地址由mm_struct中成员项mmap指出。

4.2 虚拟内存的管理

进程运行时能访问的存储空间只是它的虚拟内存空间。对当前进程而言只有属于它的虚拟内存是可见的。在进程的虚拟内存包含着进程本身的程序代码和数据。进程在运行中还必须得到操作系统的支持。进程的虚拟内存中还包含着操作系统内核。

Linux把进程的虚拟内存分成两部分,内核空间和用户空间。在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB-1的虚存地址是用户空间,用户进程可以直接访问。从3GB到4GB-1的虚存地址为内核态空间,存放供操作系统内核访问的代码和数据,用户态进程不能访问。所有进程从3GB到4GB-1的虚拟空间都是一样的,Linux以此方式让内核态进程共享代码段和数据段。

操作系统内核的代码和数据等被映射到内核空间。进程的可执行映像(代码和数据)映射到虚拟内存的用户空间。进程虚拟内存的内核空间的访问权限设置为0级,用户空间为3级。内核访问虚存的权限为0级,而进程的访问权限为3级。

Linux运行在I386时,进程的虚拟内存为4GB。进程虚存空间的划分在系统初始化时由GDT确定,它定义在/arch/i386/kernel/head.S文件中。

Linux的存储管理主要是管理进程虚拟内存的用户区。进程虚拟内存的用户区分成代码段、数据段、堆栈以及进程运行的环境变量、参数传递区域等。

Linux用结构mm_struct描述了一个进程的整个虚拟地址空间。mm_struct结构包含了当前可执行文件信息和进程页目录指针pgd,以及指向vm_area_struc结构链表的指针。进程的task_struct内嵌了mm_struct的指针mm。

每一个进程,用一个mm_struct结构体来定义它的虚存用户区。mm_struct结构体首地址在任务结构体task_struct成员项mm中。mm_struct结构定义在/include/linux/schedul.h中(不同的版本结构略有不同)。

struct mm_struct

{

  struct vm_area_struct * mmap;     /*指向VMA链表表头的指针*/

  rb_root_t mm_rb;            /*指向进程红黑树的根*/

  struct vm_area_struct * mmap_cache;

  pgd_t * pgd;              /*指向进程页目录表的指针*/

  atomic_t mm_users;          /*用户空间数*/

  atomic_t mm_count;          /* 访问mm_struct结构的计数*/

  int map_count;            /* VMA的数量 */

  struct rw_semaphore mmap_sem;

  spinlock_t page_table_lock;      /*保护任务页表和mm-〉rss*/

  struct list_head mmlist;        /*所有活动mm的列表*/

  unsigned long start_code, end_code, start_data, end_data; /*分别为代码段、数据段的 *首地址和终止地址*/

  unsigned long start_brk, brk, start_stack;

  unsigned long arg_start, arg_end, env_start, env_end; /*分别为参数区、环境变量区的*首地址和终止地址*/

  unsigned long rss, total_vm, locked_vm; /*驻留内存页框总数,VMA总数及被锁*VMA总数*/

  unsigned long def_flags;

  unsigned long cpu_vm_mask;

  unsigned long swap_address;

  unsigned dumpable:1;

  mm_context_t context; /*和具体硬件结构有关的MM上下文*/

};

mm_struct结构描述了一个进程的页目录,有关进程的上下文信息,以及数据,代码,堆栈的起始、结束地址,还有虚拟存储器的数目,以及调度存储用的链表指针。

Linux在管理进程虚存空间时定义了虚存段(vma)。虚存段是进程一段连续的虚存空间,在这段虚存里,所有单元拥有相同特征。Linux用数据结构vm_area_struct描述了虚存段的属性,它主要包括:

(1)vma在虚存中的起始地址和终止地址。

(2)vma段内容来源,例如磁盘文件由其inode指示。

(3)一系列对vma操作例程。

(4)同一进程的vma段的vm_area_struct结构通过vm_next指针连接组成链表。系统以虚拟内存地址的降序排列vm_area_struct结构。这样建立了文件的逻辑地址到虚拟线性地址的映射。

vm_area-struct是描述进程的虚拟地址区域,一个虚存区域是虚存空间中一个连续的区域,在这个区域中的信息具有相同的操作和访问特性。它形成一个单向链表,这样当内核需要在一个给定进程页上执行给定操作时,可从双向列表中找到该项。每个虚拟区域用一个vm_area_struct结构体进行描述,它定义在/include/linux/mm.h中:

struct vm_area_struct {

 struct mm_struct * vm_mm; /* vm_mm指针指向进程的mm_struct结构体*/

 unsigned long vm_start; /*虚拟区域的开始地址*/

 unsigned long vm_end; /*虚拟区域的终止地址*/

 /*每个进程的虚存区链表,按地址排序*/

 struct vm_area_struct vm_next; /*指向下一个vm_area_struct结构体,链表的首地址由*mm_struct中成员项mmap指出*/

 pgprot_t vm_page_prot; /*该VMA的访问权限*/

 unsigned short vm_flags; /*指出虚存区域的操作特性*/

 struct rb_node vm_rb;

 struct list_head shared;

 struct vm_operations_struct * vm_ops; /*指向vm_operations_struct结构体的指针,  *该结构体中包含着指向各种操作函数的指针*/

 /* 后援存储器的信息*/

 unsigned long vm_pgoff; /*PAGE_SIZE单元中的偏移量,不是PAGE_CACHE_SIZE*/

 unsigned long vm_offset; /*该区域的内容相对于文件起始位置的偏移量,或相对于共*享内存首址的偏移量*/

 struct file * vm_file;/* 若虚存区域映射的是磁盘文件或设备文件的内容,则vm_file *指向这个文件,否则为NULL*/

 void * vm_private_data; /*共享内存页表vm_pte */

};

vm_flags指出了虚存区域的操作特性,参见表4-1。

表4-1 vm_flags的含义

img16

所有vm_area_struct结构体链接成一个单向链表,vm_next指向下一个vm_area_struct结构体。链表的首地址由mm_struct中成员项mmap指出。

vm_ops是指向vm_operations_struct结构体的指针。该结构体中包含着指向各种操作的函数的指针。

struct list_head

{

  struct list_head *next, *prev;

};

shared中的前后向指针,把有关的vm_area_struct结合成一个共享内存时使用的双向链表。

mm中的vma按地址排序由线性链表连接起来,当vma的数量相当大的时候启用AVL树,与线性链表同时管理vma以提高访问效率。随着vma的动态改变,vma之间存在归并和拆分等操作。分配vma并不立即分配页帧。

img17

图4-4 进程虚存空间管理

所有vm_area_struct结构体组成一个红黑树,也称为AVL(Adelson-Velskii and Landis)树。AVL树是一种具有平衡结构的二叉树。

struct rb_node

{

  struct rb_node *rb_parent;

  int rb_color;

  #define RB_RED  0

  #define RB_BLACK 1

  struct rb_node *rb_right;

  struct rb_node *rb_left;

};

struct rb_root

{

  struct rb_node *rb_node;

};

进程虚存空间如图4-4所示。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈

Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25