欢迎来到360期刊网
360期刊网
客服电话:4006-587-789 客服在线时间:09:00~22:30(节假日不休息) 客服邮箱:360qikan@vip.163.com

Linux虚拟内存管理

时间:2012-09-21 10:28来源:未知 作者:360期刊网 点击:

  Linux能够使用文件系统中的一个常规文件或一个独立的先区作为交换空间。交换分区要快一些,但是很容易改变交换文科的大小。当你知道你需要多大的交换空间时,你应该使用交换到区,但是如果你不能确定的话,你可以首先使用一个交换文件,然后使用一阵子系统,你就可以感觉到要有多大的交换空间,时时,当你能够确信它的大小时就创建一个交换分区。

  1、虚拟存储器的思想

  一个进程的代码,数据,堆拢的总容量可能超过可用物理萨存的容量,操作系统负责吧当前用到的那些部分保留在内存中,而把其他部分保存在磁盘L当需要用到不再内存的某一个部到时,由操作系统把那部分调入内存,同时把已经在内存中的但主暂时用不到的部分清除出去。这些操作对用户来说都是透明的o

  2,Unux支持虚拟肉存(virtualmemory)

  虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存配大小就相应地增大了。内核会将暂时不用的内存块的内容写到翻盘上,这样一来,这块内存就可用于其它目了。当需要用到原好的内容时,它们被重新i卖入内存。这些操作对用户来说是完全逆明的。,与然,i卖写硬盘要比直接使用真实内存慢得多,所以程丹就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部主被称为交换空间(swapspace)0

  3、Unux虚拟内存的实现需要6种机制的支持

  地址映射机制、内存分配回收机制、缓存和刷新机制、请在页机制、交换机制和内存共享机制c

  存管理程序通过映射机制把用户程序的逻辑地址映射到物到地址。当用户程序运行时,如果发现程序中要用的虚地址没有x·应的物理内存,就发出了请求页要求。如果有空闲的内存可供f配,就请求分配内存(于是用到了内存的分配和回收),并把正在使用的物理页记录在缓存中(使用了缓存机制)。如果没有足够配内存可供分配,那么就调用交换机制;腾出一部分内存。另外,在地址映射中要通过TLB(翻译后援存储器)来寻找物理页;交换相制中也要用到交换缓存,并且把物理页内容交换到交换文件中,也要修改页表来映射文件地址。

  Linux总是假定处理器支持三级页表结构。这三届页表依沙为页目录(PGD,PageDirectory),中间反目录(PMD,PageMiddl,Directory)和页表(PTE,PageTahle).每一级页表通过虚拟地址自一个域来访问。

  推荐阅读:《计算机工程与科学》

  趴在INTELX86TI汩的微机上

  Linux的页表结构实际上为两级其中页表目录就是PGD,页若就是PTE,而PMD和PGD实际上是合二为一的。所有有关PMD的括作实际上是对PGD的操作。所以源代码中过的形如*_pgd_*O和飞pmd_*O的函数所实现的功能是一样的O有关的宏定义如下:

  linclude/asm一i386/pgtahle-21level.h

  (1)#ifndef一I386]GTABLL2LEVLE_H

  (2)#define_I386]GTABLE_2LEVLE_H(3)1*

  (4)*traditionali386two-levelpagingstructure:(5)*1

  (6)#definePGDIR_SHIFT22

  (7并且nePTRS]ER]GD1024

  从上面的宏定义可以清楚地看到i386体系结构中PMD实际上是不存在的,PMD(中间页目录)只含有一项(#definePTRSPER]MD1),实际上这一级已经是退化了o页目录PGD和页表PTE都含有1024个项。

  5、按需调页分析

  我们来看一下2.4.18版的linuxkernel按需调页的过程:

  首先由缺页中断进入do_page_fault函数,该函数是缺页中断服务的入口原l数。该函数先查找出现却也的虚拟存储区的vrn_area_struct结构,如果没有找到则说明进程访问了一个非法地址,系统将向进程发迭出错信号。若地址是合法的,则接着检查缺页时的访问模式是否合法,若不合法系统将向进程发送存储访问出错的信息。通过上述两步检查之后,可以确定发生的却也情况是正常的,可以进入下一步处理。

  larchli386/mrnlfault.c

  147asmlinkagevoiddo_page_fault(structpt_regs*regs,unsigned

  longerror_code)148

  149structtask_struct*tsk;

  155intwrite:

  156siginfo_tinfo;

  do_pagιfaultO函数入口,asmlinkage指示编译器不要使用寄存器,而是使用堆战来传递参数。Regs是structpCregs结构的指针,保存了在发生异常是的寄存器内容。EπOf_code是一个32位长整形数据,但是只有最低3位有效,在发生异常时,有CPU的控制部分根据系统习前上下文的情况,生成此3位数据,斥入堆枝。

  本文由360期刊网整理发布,转载请注明出处!