精华内容
下载资源
问答
  • 缺页
    千次阅读
    2019-03-31 10:56:40

    一个虚拟存储系统,若进程在内存中占3页(开始时内存为空),采用先进先出(FIFO)页面淘汰算法,当执行如下访问页号序列后1,2,3,5, 1,3,会发生多少缺页?

     

    1缺页, , 1
    2缺页,1,2
    3缺页123
    5缺页235
    1缺页351
    3不缺页351

     

     

     

     

     

     

     

    5次 缺页,注意前三次都是缺页!

    更多相关内容
  • 用户空间的缺页异常可以分为两种情况–  1、触发异常的线性地址处于用户空间的vma中,但还未分配物理页,如果访问权限OK的话内核给进程分配相应的物理页了  2、触发异常的线性地址不处于用户空间的vma中,这种...
  • 分页存储的换页算法类题 大题第六题 在一个请求分页系统中,整数占4B,页大小为256B,使用最近最少使用页面替换算法,每个进程分配3个页框。一个进程执行下列代码: ...(2)程序将产生多少个缺页? 分
  • $多系汕乂琴实验报告 课程名称 操作系统原理 实验名称 虚拟页式管理 姓 名 学号 ...并用 先进先出调度算法FIFO处理缺页中断 1内容模拟请求页式存储管理中硬件的地址转换和缺页中断处理 2.思想 装入新页置换旧页时若旧页
  • 适用于操作系统第三版微课版教材
  • 精品课件
  • 内存管理 Linux 关于内存管理的所有。alloc()和mmap()等内存分配...缺页异常是Linux内存管理中最复杂和重要的一部分,需要考虑很多相关细节,包括匿名页面、KSM页面、page cache页面、写时复制、私有映射和共享映射等
  • 计操作系 缺页次数 实验目的 学习虚拟内存的基本原理和Linux 虚拟内存管理技术 深入理解掌握Linux 的按需调页过程 实验内容 统计操作系统自内核加载以后累计发生的缺页次数以及总运行时间 实验提示 一原理 由于每...
  • 精选文库 PAGE PAGE 2 -- 实验二: 统计操作系统缺页次数 林 目录 一实验目的3 二实验内容3 三.实验步骤3 统计操作系统缺页次数 一 实验目的 学习虚拟内存的基本原理和Linux虚拟内存管理技术 深入理解掌握Linux的按需...
  • 请求页式管理缺页中断模拟设计FIFO,OPT.而我选择的是FIFO,OPT调度算法。主要考虑三种情况:1.不缺页,此时我不需要从外存中调入新的页面进入内存;2.缺页,但是内存空间块数没有满,不需要淘汰内存中的页面,把缺页...
  • linux内核源码分析之缺页异常

    千次阅读 2022-07-24 21:26:07
    通常情况下称为缺页异常访问用户栈的时候,超出了当前用户栈的范围,需要扩大用户栈当进程申请虚拟内存区域的时候,通常没有分配物理页,进程第一次访问的时候触发页错误异常。内存不足的时候,内核把进程的匿名页换...

    目录

    一、什么是缺页异常?

    二、处理器特定部分

    2.1生成页错误异常

    2.2处理页错误异常

    三、匿名页的缺页异常

    四、文件的缺页异常

    4.1 处理文件页错误,具体处理读文件页错误的方法

    4.2 文件写私有文件页错误的方法

    4.3文件写共享文件页错误的方法如下

    五、写时复制

    六、内核模式页错误异常

    ARM64架构下内核发送的页错误异常处理


    想分析内存缺页相关的程序,先看一下基础知识。有了基础知识,才能很好的理解程序。

    一、什么是缺页异常?

            在取指令或数据的时候,处理器的内存管理单元需要把虚拟地址转换成物理地址。如果虚拟也没有找到物理页时,或者没有访问权限,处理器将生成页错误异常。通常情况下称为缺页异常

    大概有以下情况:

    1. 访问用户栈的时候,超出了当前用户栈的范围,需要扩大用户栈
    2. 当进程申请虚拟内存区域的时候,通常没有分配物理页,进程第一次访问的时候触发页错误异常。
    3. 内存不足的时候,内核把进程的匿名页换出到交换区
    4. 一个文件页被映射到进程的虚拟地址空间,内存不足时,内核回收这个文件页,在进程的页表中删除这个文件的映射
    5. 程序错误,访问没有分配给进程的虚拟内存区域,将会发出SIGSEGV信号将进程杀死。

    没有访问权限,有以下两种情况:

    1. 可能是软件有意造成的,如写时复制:子进程和父进程以只读的方式共享私有的匿名页和文件页。当其中一个进程试图写只读页时,触发页错误异常,页错误异常处理程序分配新的物理页,把旧的物理页数据复制到新的物理页,然后把虚拟页映射到新的物理页。
    2. 程序错误,如试图写只读的代码段所在的物理页。

            不同处理器架构的页面错误异常不同,页错误异常处理程的前面一部分是各处理器架构自定义部分,后面函数handle_mm_fault开始是共同架构。

    二、处理器特定部分

    2.1生成页错误异常

    ARM64处理器在取指令或数据的时候,需要把虚拟地址换成物理地址,分为两种情况:

    1)如果虚拟地址的高16位不全是1或全0,是非法地址,生成页错误异常。

    2,处理页错误异常高16位全是1或全0,内存管理单元根据关键字{地址空间标识符,虚拟地址}查找TLB。

    如果命中了TLB选项,从TLB表项读取访问权限,检查访问权限,如果没有访问权限则生成页错误异常。

    如果没有命中TLB选项,内存管理单元将会查询内存中的页表,称为转换遍历。

    • 如果虚拟地址的高16位全是1,说明是内核虚拟地址,应该查询内核的页表,从寄存器TTBR1_EL1取内核的页全局目录的物理地址。
    •  如果虚拟地址的高16位全是0,说明是用户虚拟地址,应该查询进程的页表,从寄存器TTBR0_L1取进程的页全局目录的物理地址。

    2.2处理页错误异常

    在ARM64架构中,用户程序在异常级别0运行,内核在异常级别1运行。

    ARM64定义了一个异常向量表,起始地址是vectors(arch/arm64/kernel/entry.S)每个异常向量表的长度是128字节,但是在linux内核中每个异常只存在一条指令,跳转到对应的处理程序。异常向量表的虚拟地址放在异常级别1的向量基准地址寄存器(VBAR_EL1)中。


    三、匿名页的缺页异常

    发生情况

    1. 函数的局部变量比较大,或者函数调用层次比较深,导致当前栈不够用,需要扩大栈;
    2. 进程调用malloc,从堆申请了内存块,只分配虚拟内存区域,还没有映射到物理页,第一次访问时触发缺页异常
    3. 进程直接调用mmap,创建匿名的内存映射,只分配了虚拟内存区域,还没有映射到物理页,第一次访问时触发缺页异常。

    缺页异常函数 do_anonymous_page处理私有匿名的缺页异常。

    四、文件的缺页异常

    发生情况

    1. 启动程序的时候,内核为程序的代码段和数据段创建私有文件映射,映射到进程的虚拟地址空间,第一次访问的时候,触发问你件页的缺页异常。
    2. 进程使用mmap创建文件映射,把文件的一个区间映射到进程的虚拟地址空间,第一次访问的时候,触发文件页的缺页异常。

    处理函数 __do_fault()

    4.1 处理文件页错误,具体处理读文件页错误的方法

    1. 把文件页从存储设备上的文件系统读到文件缓存(每个文件有一个缓存,因为以页为单位,所以称为页缓存)中
    2. 设置检测的页表项,把虚拟页映射到文件页缓存的物理页。

    函数do_read_fault()

    给定一个虚拟内存区域vma,函数filemap_fault读文件页的方法如下

    1. 根据vma->vm_file得到文件的打开实例file
    2. 根据file->f_mapping得到文件的地址空间mapping
    3. 使用地址空间操作集合中的readpage方法(mapping->a_ops->readpage)把文件页读到内存中
    4. 函数finish_fault 负责设备项页表,把主要工作委托给函数alloc_set_pte,执行流程及源码分析

    4.2 文件写私有文件页错误的方法

    1. 把文件页从存储设备上的文件系统读到文件的页缓存中;
    2. 执行写时复制,为文件的页缓存中的物理页创建一个副本,这个副本是进程的私有匿名页和文件脱离系统,修改副本不会导致文件变化;
    3. 设备进程的页表项,把虚拟页映射到副本;

    函数do_cow_falut处理写私有文件页错误

    4.3文件写共享文件页错误的方法如下

    1. 把文件页从存储设备上的文件系统读到文件的也缓存中
    2. 设备进程的页表项,把虚拟地址映射到文件的页缓存中的物理页

    函数do_shared_fault处理写共享文件页错误

    五、写时复制

    有两种情况会执行写时复制

    1. 进程创建子进程的时候,为了避免复制物理页,子进程和父进程以只读方式共享私有的匿名页和文件页。当其中一个进程试图写只读页时,触发页错误异常,页错误异常的处理程序分配新的物理页,把旧的物理页的数据复制到新的物理页,然后把虚拟页映射到新的物理页。
    2. 进程创建私有的文件映射,然后读访问,触发页错误异常,异常处理程序把文件读到页缓存,然后以只读模式把虚拟页映射到文件的页缓存中的物理页。接着执行写访问,触发页错误异常,异常处理程序执行写时复制,把文件的页缓存中的物理页创建一个副本,把虚拟页映射到副本。这个副本是进程的私有匿名页,和文件脱离关系,修改副本不会导致文件变化。

    六、内核模式页错误异常

            内核访问虚拟地址时,内核使用线性映射,正常情况下不会出现没有映射到的情况。如果虚拟页没有映射到物理页,一定会出现内核崩溃。

            内核运行时可能使用vmalloc()函数从vmalloc区域分配虚拟内存区域,vmalloc函数会分配并且映射到物理内页。

            内核可能访问用户虚拟地址。进程通过系统调用进入内核模式,有些系统调用会传入用户空间缓冲区。如果出现页错误异常,页错误异常处理程序发现用户虚拟地址没有被分配给进程,就会在异常表中(uaccess.h 专用函数访问用户空间缓冲区)查找指令地址对应的异常修正程序,如果找到了,修复异常,避免内核崩溃。

    ARM64架构下内核发送的页错误异常处理

    1)如果不允许内核执行用户空间指令,那么进程在内核模式下试图执行用户空间的质量时,内核崩溃。

    2)如果进程在内核模式下访问用户虚拟地址,那么先使用函数__do_page_fault处理,如果处理失败,最后使用__do_kernel_fault处理

    3)其他情况使用函数__do_kernel_fault处理。

     参考链接

    零声教育


    展开全文
  • 缺页异常理解

    2021-06-30 17:15:57
    5.2 缺页错误的分类处理 缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理: Hard Page Fault 也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的...

    术语约定

    VA:Virtual Address 虚拟地址
    PA:Physical Address 物理地址
    MMU:Memory Manage Unit 内存管理单元
    TLB:Translation Lookaside Buffer 旁路快表缓存/地址变换高速缓存
    PTE:Page Table Entry 分页表项
    内存的惰性分配

    以32位的Linux系统为例,每个进程独立拥有4GB的虚拟地址空间,根据局部性原理没有必要也不可能为每个进程分配4GB的物理地址空间。

    64位系统也是一样的道理,只不过空间寻址范围大了很多很多倍,进程的虚拟地址空间会分为几个部分:

    实际上只有程序运行时用到了才去内存中寻找虚拟地址对应的页帧,找不到才可能进行分配,这就是内存的惰性(延时)分配机制。

    对于一个运行中的进程来说,不是所有的虚拟地址在物理内存中都有对应的页,如图展示了部分虚拟地址存在对应物理页的情况:

    虚拟地址空间根据固定大小一般是4KB进行划分,物理内存可以设置不同的页面大小,通常物理页大小和虚拟页大小是一样的,本文按照物理页4KB大小展开。

    经过前面的分析,我们将面临一个问题:如何将虚拟地址准确快速地映射到物理页呢?

    高能预警 敲黑板 本段小结<<<

    1. Linux的虚拟地址空间就是空头支票,看着很大但是实际对应的物理空间只有很少的一部分。

    2.内存的惰性分配是个有效的机制,可以保证内存利用率和服务器利用率,是资源合理配置的方法。

    3.大量的虚拟地址到物理地址的快速准确地查询转换是一个难题。

    CPU如果获取内存中的数据

    CPU并不直接和物理内存打交道,而是把地址转换的活外包给了MMU,MMU是一种硬件电路,其速度很快,主要工作是进行内存管理,地址转换只是它承接的业务之一。

    一起看看MMU是如何搞定地址转换的。

    4.1 MMU和Page Table

    每个进程都会有自己的页表Page Table,页表存储了进程中虚拟地址到物理地址的映射关系,所以就相当于一张地图,MMU收到CPU的虚拟地址之后开始查询页表,确定是否存在映射以及读写权限是否正常,如图:

    对于4GB的虚拟地址且大小为4KB页,一级页表将有2^20个表项,页表占有连续内存并且存储空间大,多级页表可以有效降低页表的存储空间以及内存连续性要求,但是多级页表同时也带来了查询效率问题。

    我们以2级页表为例,MMU要先进行两次页表查询确定物理地址,在确认了权限等问题后,MMU再将这个物理地址发送到总线,内存收到之后开始读取对应地址的数据并返回。

    MMU在2级页表的情况下进行了2次检索和1次读写,那么当页表变为N级时,就变成了N次检索+1次读写。

    可见,页表级数越多查询的步骤越多,对于CPU来说等待时间越长,效率越低,这个问题还需要优化才行。

    本段小结 敲黑板 划重点 <<

    1.页表存在于进程的内存之中,MMU收到虚拟地址之后查询Page Table来获取物理地址。

    2.单级页表对连续内存要求高,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率。

    4.2 MMU和TLB的故事

    MMU和TLB的故事就这样开始了…

    CPU觉得MMU干活虽然卖力气,但是效率有点低,不太想继续外包给它了,这一下子把MMU急坏了。

    MMU于是找来了一些精通统计的朋友,经过一番研究之后发现CPU用的数据经常是一小搓,但是每次MMU都还要重复之前的步骤来检索,害,就知道埋头干活了,也得讲究方式方法呀!

    找到瓶颈之后,MMU引入了新武器,江湖人称快表的TLB,别看TLB容量小,但是正式上岗之后干活还真是不含糊。

    当CPU给MMU传新虚拟地址之后,MMU先去问TLB那边有没有,如果有就直接拿到物理地址发到总线给内存,齐活。

    TLB容量比较小,难免发生Cache Miss,这时候MMU还有保底的老武器页表 Page Table,在页表中找到之后MMU除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录一下刷新缓存。

    TLB容量不满的时候就直接把新记录存储了,当满了的时候就开启了淘汰大法把旧记录清除掉,来保存新记录,彷佛完美解决了问题。

    在TLB和Page Table加持之下,CPU感觉最近MMU比较给力了,就问MMU怎么做到的?MMU就一五一十告诉了CPU。

    CPU说是个不错的路子,随后说出了自己的建议:TLB还是有点小,缓存不命中也是经常发生的,要不要搞个大的,这样存储更多访问更快?

    MMU一脸苦笑说道大哥TLB很贵的,要不你给涨点外包费?话音未落,CPU就说涨工资是不可能了,这辈子都不可能了。

    高能预警 敲黑板 本段小结<<<

    1. CPU要根据用户进程提供的虚拟地址来获取真实数据,但是它并不自己做而是交给了MMU。

    2. MMU也是个聪明的家伙,集成了TLB来存储CPU最近常用的页表项来加速寻址,TLB找不到再去全量页表寻址,可以认为TLB是MMU的缓存。

    3. TLB的容量毕竟有限,为此必须依靠Page Table一起完成TLB Miss情况的查询,并且更新到TLB建立新映射关系。

    缺页异常Page Fault大揭秘

    设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对,该怎么办呢?

    没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误。

    5.1 PageFault,它来了

    假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限,CPU 就无法获取数据,这种情况下CPU就会报告一个缺页错误。

    由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理。

    缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。

    5.2 缺页错误的分类处理

    缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理:

    Hard Page Fault 也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立VA和PA的映射。
    Soft Page Fault 也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。
    Invalid Page Fault 翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉。

    5.3 缺页错误出现的原因

    不同类型的Page Fault出现的原因也不一样,常见的几种原因包括:

    非法操作访问越界 这种情况产生的影响也是最大的,也是Coredump的重要来源,比如空指针解引用或者权限问题等都会出现缺页错误。
    使用malloc新申请内存 malloc机制是延时分配内存,当使用malloc申请内存时并未真实分配物理内存,等到真正开始使用malloc申请的物理内存时发现没有才会启动申请,期间就会出现Page Fault。
    访问数据被swap换出 物理内存是有限资源,当运行很多进程时并不是每个进程都活跃,对此OS会启动内存页面置换将长时间未使用的物理内存页帧放到swap分区来腾空资源给其他进程,当存在于swap分区的页面被访问时就会触发Page Fault从而再置换回物理内存。

    敲黑板 划重点 本段小结:<<<

    触发Page Fault的原因可能有很多,归根到底也只有几种大类:

    1. 如使用共享内存区域,没有存储VA->PA的映射但是存在物理页帧的软缺页错误,在Page Table/TLB中建立映射关系即可。

    2. 访问的地址在物理内存中确实不存在,需要从磁盘/swap分区读入才能使用,这种性能影响会比较大,因为磁盘太慢了,尽量使用高性能的SSD来降低延时。

    3. 访问的地址内存非法,缺页错误会升级触发SIGSEGV信号结束进程,这种属于可以导致进程挂掉的一种缺页错误。

    全文总结

    本文粗浅地和大家一起学习了Page Fault的相关知识点,包括Linux虚拟地址和物理地址的关系、CPU获取内存数据的过程、MMU和TLB&页表的协同配合、缺页异常产生的原因和分类处理。

    展开全文
  • Linux缺页中断处理

    2021-05-17 19:27:23
    Linux缺页中断处理在i386 CPU将一个线性地址映射为物理地址的过程中,如果该地址的映射已经建立,但是发现相应的页面表项或目录项中的P(Present)标志为0,则表明相应的物理页面不在内存.此时,CPU将错误的请求地址放在...

    Linux缺页中断处理

    在i386 CPU

    将一个线性地址映射为物理地址的过程中,如果该地址的映射已经建立,但是发现相应的页面表项或目录项中的P(Present)标志为0,则表明相应的物理

    页面不在内存.此时,CPU将错误的请求地址放在寄存器CR2中,并发生缺页中断.穿过了中断门后,控制直接到达程序入口page_fault(),该入

    口代码将页面失败处理例程do_page_fault()的地址压栈,并调用通用的错误处理例程保存现场并使控制转移到do_page_fault().

    至此,完成了软硬件的交接.

    对于硬件来说,CPU发生缺页中断即认为指令访问了无效的地址空间.但是,从操作系统的角度,其原因可能是多样的.而

    且,内核的中断处理程序也可能进入do_page_fault(),在这里我们只考虑页面失败发生在当前进程的情况.在Linux中,控制进入

    do_page_fault()的原因可能有:1,真实的地址越界,即进程访问了不属于自己的地址空间;2,页面已经映射,但未载入内存或者已被换

    出;3,进程页面未被映射,即相应的页表不存在.

    通过判断currentTask->mm是否为空,就可确定是进程的内存是否还未映射,如

    果还为映射,则控制将转到no_context.否则,为了区分越界还是缺页,do_page_fault()首先从CR2中读出出错的地址

    address,然后调用find_vma(mm,

    address),在进程的虚拟地址空间中找出结束地址大于address的第一个区间.如果找不到的话,则说明异常是由地址越界引起的,转到

    bad_area执行相关错误处理.而下面我们将重点讨论页面未映射或被换出这两种情况.

    确定并非地址越界后,控制转向标号good_area.

    在这里,代码首先对页面进行例行权限检查,比如当前的操作是否违反该页面的Read,Write,Exec权限等等.如果通过了检查,则进入虚存管理例程

    handle_mm_fault().否则,将与地址越界一样,转到bad_area继续处理.

    handle_mm_fault()用于实现页面分配与交换.它分为两个步骤:首先,如果页表不存在或被交换出,则要首先分配页面给页表;然后,才真正实施页面的分配,并在页表上做记录.

    handle_mm_fault()

    首先求出address所属的页目录项指针pgd,然后调用pte_alloc(pgd),pte_alloc()会首先判断该目录项对应的页表是否存

    在,如果不存在的话就分配一个新的页表并返回.pte_alloc()分配页表时,会首先调用get_pte_fast(),试图从页面缓冲池中获取页表

    空间,而如果缓冲池空,则调用get_pte_kernel_slow()从磁盘上获取用于存放页表的页面.然后,pte_alloc()会调用

    set_pmd()初始化这个页表,即将该页表的起始地址,标志位等写入页目录项pgd.到此为止,页表pte的空间已分配并初始化,但并不包含任何内

    容.接着,handle_mm_fault()将调用handle_pte_fault()来具体分配页面并填充页表pte.

    handle_pte_fault()

    是实现虚存管理的核心部分,它实现了页面的分配和交换.它首先调用pte_present()检查表项中的P标志位,当然,在我们的讨论中它总是返回

    false.接着,又调用pte_none()检查表项是否为空,即全为0.如果为空就说明映射尚未建立,此时调用do_no_page()来建立内存页

    面与交换文件的映射;反之,如果表项非空,则说明页面已经映射,只要调用do_swap_page()将其换入内存即可.

    do_no_page()

    除了能够分配物理页面外,还用于实现内存映射文件及共享页面等.在我们讨论的缺页中断中,它只会调用do_anonymous_page()分配一个新的

    物理页面,并设置相应的页表项.此外,该过程还会进行一些权限检查,在此略过.do_anonymouse_page()是通过调用

    alloc_pages()完成实际内存分配的.如果分配成功,则整个缺页中断处理过程完成,所有过程依次退栈返回.当控制返回到用户空间后,因为缺页而

    夭折的那条指令会被重新执行.从用户程序的角度来看,这一切就像没有发生过一样,缺页中断处理对用户是透明的.

    上面讨论的是页面未映射的情况.如果已经完成了页面映射,而缺页是由于页面被换出而引起的,则应调用do_swap_page()将从交换设备上换入页面.为了研究Linux的页面置换方法,必须先弄清相关的数据结构.

    所周知,对于i386系列处理器,当页面在内存中时,页表项是一个32位的pte_t结构,它描述了物理页面起始地址,页面权限标志等信息,这些信息将被

    CPU用于地址转换.但是,这一切的前提是,该表项的P标志位为1.否则,这个32位的页表项将被CPU视为无意义的.但是对于操作系统而言,当它换出页

    面之时,应该在设置P标志为0的同时,将页面对应的磁盘页信息放入页表项,以供调回页面时获取.即同样一个32位的页表项,在P标志位不同时,实际上对应

    着不同的存储内容.就Linux而言,如果页表项的P标志位0,则该页表项存放的实际上是一个swap_entry_t结构,它确定了该页面在磁盘上唯一

    位置,包括用于交换的文件或设备的序号,以及页面在此文件或设备中的相对位置.

    do_swap_page()会首先调用

    lookup_swap_cache(),判断相应的内存页面是否还留在swapper_space的换入/换出队列中尚未最后释放.如果确实已经释放,

    则通过read_swap_cache()分配一个内存页面,并从磁盘中读取先前交换出的页面内容到分配的页中,当然,要读取的磁盘块是从"页表项"中的

    swap_entry_t结构获得的.同时,出于性能考虑,还会调用swapin_readahead()将一些临近的页面顺带一起读入上面提到的

    swapper_space中,与此相关还涉及到一些复杂的异步读取操作,在此略过不提.最后,do_swap_page()还要设置页表项的一些标志信

    息(例如P,D等),访问权限等.最后,如同do_no_page()执行完毕后一样,返回到用户空间,重新执行因缺页而夭折的指令.

    上面已经完

    整描述了Linux缺页中断处理的大致流程,但并没有详细描述页面交换时的换入/换出算法.事实上,其中的

    alloc_page,read_swap_cache等调用都可能导致其他页面被换出.至于Linux是如何淘汰页面的,是一个比较复杂的话题,但大体

    说来它所采用的淘汰策略是LRU.

    最后,将整个缺页中断的处理流程用图表示如下:

    参考文献:《Linux内核源代码情景分析》 毛德操 胡希明

    展开全文
  • 发生缺页中断时,处理器会跳转到异常向量表 Data abort 向量中开始执行缺页中断的汇编阶段,这个阶段与处理器架构紧密联系,例如对于ARMv7-A架构,汇编处理流程为:__vectors_start -> vector_dabt -> __dabt_...
  • linux内存管理(九)-缺页异常分析

    千次阅读 2021-06-17 20:15:40
    缺页异常被触发通常有两种情况 a.程序设计的不当导致访问了非法的地址 b.访问的地址是合法的,但是该地址还未分配物理页框 下面解释一下第二种情况,这是虚拟内存管理的一个特性。尽管每个进程独立拥有3GB的可访问...
  • 操作系统缺页异常

    2021-05-18 14:13:15
    缺页异常,页缺失Page fault,指的是硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在虚拟地址空间中,但是目前并未被加载在物理内存中的一个分页时,由中央处理器的内存管理...
  • 计算机操作系统中,缺页次数和缺页中断次数这两个是不一样的概念。 缺页次数指的是操作系统将页从外存调入内存的次数,而缺页中断次数指的是由于内存块数量的限制,将内存中暂时用不到的页面与外存中需要调入内存的...
  • 采用最佳淘汰算法OPT和最近最久未使用淘汰算法LRU,通过编程,计算这两种方法的缺页次数以及缺页率。 输入情况以及运行结果: 代码: #include<stdio.h> #include<stdlib.h> #define N 20 ...
  • 缺页中断过程详解

    千次阅读 2022-04-26 11:09:00
    缺页中断机构 总而言之: 对于我们的缺页的访问,会发生一个缺页中断。(缺页中断由当前指令发出,所以属于内中断) 中断后该程序就阻塞了,然后等待中断程序结束,再执行。 中断程序判断,内存中是否有空闲内存块:...
  • 前面简单的分析了内核处理用户空间缺页异常的流程,进入到了handle_mm_fault()函数,该函数为触发缺页异常的地址address分配各级的页目录,也就是说现在已经拥有了一个和address配对的pte了,但是这个pte如何去映射...
  • //该分支表明发生缺页时是发生在访问内核空间时 if(unlikely(address >= TASK_SIZE)) { //该分支表示发生缺页异常时,代码是在内核态访问内核态不存在 //的地址,转到vmalloc_fault处理分支,可能是访问了不连续...
  • 表示每秒从内存置换到磁盘或SWAP的字节数(KB) fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor) majflt/s:每秒钟产生的主缺页数. pgfree/s:每秒被放入空闲队列中的页个数 pgscank/s:每秒被...
  • 本实验要求模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。以此来加深对虚拟存储的理解。 第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。 第二题:用先进先...
  • 缺页中断统计

    2022-05-10 18:45:20
    一、实验名称:缺页中断统计 二、实验目的与要求 目的:通过本次实验,理解页面置换过程,加深对页式虚存管理的原理和实现过程的理解。 要求:设计和实现最佳页面置换算法,并统计缺页中断率。 三、实验内容 设...
  • 操作系统页式虚拟存储管理中地址转换和缺页中断55 解析
  • 缺页中断和缺页异常

    2021-05-07 14:55:00
    缺页中断和缺页异常
  • 内核缺页原理简介

    千次阅读 2019-02-16 12:23:10
    页管理与缺页 零页是操作系统镜像中一块不可写的静态内存区域,其虚拟地址是页对齐的。所有进程都使用这个页,因为进程在没有写数据时,读出的数据是不定的,指向同一个页,节约了物理内存 概念 缺页是...
  • Linux缺页分析

    2021-05-18 06:23:37
    表示每秒从内存置换到磁盘或SWAP的字节数(KB) fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor) majflt/s:每秒钟产生的主缺页数. pgfree/s:每秒被放入空闲队列中的页个数 pgscank/s:每秒被...
  • 缺页异常被触发通常有两种情况——1.程序设计的不当导致访问了非法的地址2.访问的地址是合法的,但是该地址还未分配物理页框下面解释一下第二种情况,这是虚拟内存管理的一个特性。尽管每个进程独立拥有3GB的可访问...
  • 用c++代码模拟操作系统缺页调度算法FIFO(先来先调度)和LRU(最近最久未使用)。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,844
精华内容 14,337
关键字:

缺页