ITPub博客

首页 > Linux操作系统 > Linux操作系统 > perfessional linux kernel archticture 学习笔记4

perfessional linux kernel archticture 学习笔记4

原创 Linux操作系统 作者:spurray 时间:2009-05-12 09:39:55 0 删除 编辑

虚拟和物理地址空间
        在大多数情况中,系统中的虚拟地址空间都比物理RAM要打,每个进程的虚拟地址的大小固定,因此,内核和CPU只能考虑虚拟地址和物理地址如何映射。
        首先的方法是使用页表分配虚拟地址给物理地址,虚拟地址和进程的用户和内核空间相关,物理地址通常标示时即可用的RAM,其理论描述见图1-6

        每个进程的虚拟地址空间被内核分成许多相等大小的部分,这些部分称之为页(page),物理内存也被分成同样大小尺寸的部分。

    
        图1-6见都显示虚拟地址空间页如何被对应于物理地址空间。举例来说:进程A的虚拟页1映射到物理页4,而进程B的虚拟页1映射到物理页5.
        物理页通常被称为页帧(page frames)。而术语页一般指的是虚拟地址空间的页。

        虚拟地址空间和物理内存的映射内购让进程间严格分离。我们的例子包括一个页帧被两个进程共享,进程A的页5和B进程的页1都指向物理地址的页帧5,不同的虚拟地址空间指向同一物理地址页帧是可以的,由于内核管理虚拟地址空间和物理地址空间的映射,它可以决定进程间是否共享内存区域。

        图也显示不是所有的虚拟地址空间也都和页帧相互连接。原因可能是这些页没有使用,或是因为数据没有导入内存,应为现在还不需要使用。也可能也已经在置换出内存到硬盘了,当需要是就置换进来。

        最后,注意,有两个等同的术语指示应用程序,一个是userland,它表示所有不属于内核的事物,该术语经常被BSD社团所使用。另一个是用户空间(userspace)。区别月userland,userspace除了表示应用程序,还表示它所运行虚拟地址空间,与之相反的是内核空间。

1.3.4 页表
        页表(page table)这个数据结构通常用来映射虚拟地址空间和物理地址空间。实现他们之间关联最简单的方法是用一个数组包含每一个虚拟地址空间的页实体,这些实体将知道相关联的页帧。但是有个一问题,对于IA-32架构来说,如果每个页有4KiB,虚拟地址有4GiB,那将有一个上百万大小的数组保存这些页(4GiB/4KiB = 1MiB),如果是64-bit的架构,那将变得非常糟糕。又有每一个进程需要一个字节的页表,对于系统的内存而言,那是不可能保留这么大的页表。
        对于大多数虚拟地址不用用直接映射虚拟地址空间页和物理页帧的,一个较少内存需求的模型可以达到同样的目的,那就是多级页。
        为了减少页表的大小并且允许忽略不需要的区域,体系结构划分每一个虚拟地址为多个部分,如图1-7所示,(划分的位的位置和体系结构相关,这里我们不关心)。在这个例子中,我使用的虚拟地址划分了四个部分,它领导了3级页表,这是一个常用的划分,然而,某些会使用四级页表,但是Linux抛弃了4级页表的方案,为了简化图片,我这里用了3级页表的图片。

   
        虚拟地址的第一部分是页全局目录(PGD,page global directory),它作为一个目录索引,它的实体指向下一个页中间目录(PMD)的数组。

        一旦对应的数组在PGD中被找到,PMD将被用作这个数组的索引,这个页中间目录指向下一个页表(page table)或是页目录(page directories)数组。

        虚拟地址的页表实体(PTE,page table entry)部分被当做一个页表的索引,因为页表实体直销页帧,所以虚拟页和页帧间的映射能够通过页表实体获取。
        虚拟地址的最后一部分是偏移(offset)。它通常被用来指定页中的一个字节位置,毕竟,每个地址指向地址空间唯一的一个位置。一些特说的页表或是没有页中间表或是页表需要创建不需要的虚拟地址空间区域。相比较单一数组方法,这个方法内够节省大量的RAM空间。
        当然,这个方法也有个缺点,每次内存访问,它需要跑遍这个实体链来获得物理地址,CPUs 试图用下面两个方法提高其速度。
        1. CPU的一个特别部分内存管理单元(MMU)是可选的,用来执行这个引用操作。
        2. 当前常用的地址索引被放在快速CPU高速缓存当中,称作翻译后援缓存器(TLB,translation Lookaside Buffer)。查找将被加速,以为不需要访问RAM中的页表。
 
        虽然高速缓存在许多体系结构中使用,但是一些操作要求来自内核的特别的注意,尤其暗示他们的内容必须是无效的,因此这些页表需要改变。相应的要调用该内核处理页表部分。如果内核在编译过程中没有要求对应的操作,他就不会对这个调用进行执行,取而代之的是什么也不做。
 
   

1-6.JPG

1-7.JPG

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12366772/viewspace-594806/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-20

  • 博文量
    6
  • 访问量
    4384