日期:2014-05-16  浏览次数:20710 次

linux内核--进程地址空间(一)

引言现代操作系统提供了一种对内存的抽象概念,叫做虚拟存储器,它为每个进程提供了一个大的,一致的,和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了3个重要的能力:

1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效的使用了主存。

2)它为每个进程提供了一致的地址空间,从而简化了存储器管理。

3)它保护了每个进程的地址空间不被其他进程破坏。

Linux操作系统同样也采用了虚拟内存技术,对一个进程而言,它好像可以访问整个系统的所有物理内存,更重要的是,即使单独一个进程,它拥有的地址空间也可以远远大于系统物理内存。

 

一:Linux虚拟内存区域及地址空间

       进程地址空间由进程可寻址的虚拟内存组成,对于某个虚拟内存地址,它要在地址空间范围内,例如: 0421f000,这个值表示的是进程32位地址空间中的一个特定的字节。尽管一个进程可以寻址4GB的虚拟内存(在32位的地址空间中),但是这并不代表它有权访问所有的虚拟地址。在地址空间中,我们更常用或者关心的是某个虚拟内存地址空间,比如 0848000-084c000,它们可以被进程访问。我们称这些可被访问的合法地址空间称为虚拟内存区域。通过内核,进程可以给自己的地址空间动态的增加或减少虚拟内存区域。

       Linux进程的虚拟内存区域一般有:代码段、数据段、堆、用户栈、共享段。每个存在的虚拟页面都保存在某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程访问。内核不用记录那些不存在的虚拟页,而这样的页也不占用存储器、磁盘或者内核本身的其他任何资源。

       进程只能访问有效内存区域的内存地址,每个内存区域也具有相关权限,如可读、可写、可执行性质。如果一个进程访问了无效范围中的内存区域或者以不正确的方式访问了有效地址,那么内核就会终止该进程,并返回  “段错误”信息。

     

二:内存描述符

    task_struct 中的一个条目 mm 指向mm_struct 即内存描述符,它描述了进程的虚拟内存当前状态。mm_struct 定义在linux/sched.h中:

复制代码
 1 struct mm_struct {
 2     struct vm_area_struct * mmap;        /* list of VMAs */
 3     struct rb_root mm_rb;
 4     struct vm_area_struct * mmap_cache;    /* last find_vma result */
 5     unsigned long free_area_cache;        /* first hole */
 6