CN117573419B - 一种页面异常处理方法及装置 - Google Patents

一种页面异常处理方法及装置 Download PDF

Info

Publication number
CN117573419B
CN117573419B CN202410059259.7A CN202410059259A CN117573419B CN 117573419 B CN117573419 B CN 117573419B CN 202410059259 A CN202410059259 A CN 202410059259A CN 117573419 B CN117573419 B CN 117573419B
Authority
CN
China
Prior art keywords
page
kernel
memory
instruction
space
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202410059259.7A
Other languages
English (en)
Other versions
CN117573419A (zh
Inventor
张�荣
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Xinlianxin Intelligent Technology Co ltd
Original Assignee
Shanghai Xinlianxin Intelligent Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shanghai Xinlianxin Intelligent Technology Co ltd filed Critical Shanghai Xinlianxin Intelligent Technology Co ltd
Priority to CN202410059259.7A priority Critical patent/CN117573419B/zh
Publication of CN117573419A publication Critical patent/CN117573419A/zh
Application granted granted Critical
Publication of CN117573419B publication Critical patent/CN117573419B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本申请提供一种页面异常处理方法及装置,包括:内核接收用户程序触发的页面异常;确定所述页面异常对应的访存地址位于内核空间,且所述用户程序具有访问所述访存地址对应页面的访问权限后,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令。该方案,不再无条件将访问内核空间视作内存误用,允许用户程序的页表同时涵盖用户空间和内核空间,且通过内核模拟执行用户程序中触发页面异常的指令,因此,能够满足在不改变硬件的情况实现用户空间的扩展。

Description

一种页面异常处理方法及装置
技术领域
本申请涉及操作系统技术领域,尤其涉及一种页面异常处理方法及装置。
背景技术
为了使不同的用户程序高效、安全地使用物理内存(包括可进行换页的外存),虚拟内存应运而生。顾名思义,虚拟内存是对物理内存的一种抽象,它介于用户程序与物理内存之间。用户程序是面向虚拟内存编写的,而不再是面向物理内存编写的。每个用户程序都有独立的虚拟内存,从而实现所有用户程序都能在相同的地址空间上运行。虚拟内存一般划分成互不重叠的内核空间和用户空间。由于内核与用户程序都需要内存才能运行,因此它们都需要占据一定的虚拟内存。内核运行在虚拟内存的内核空间上,用户程序运行在虚拟内存的用户空间上。内核具有特权,可以访问用户空间;用户空间缺乏特权,访问内核空间将引发异常。
由于用户程序只能访问用户空间,也就是说一个用户程序所能使用的最大内存空间取决于用户空间的大小,比如对于某些指令集架构(Instruction Set Architecture,ISA)而言,在 32 位计算机上用户空间是 2GB,如果这 2GB 已经被用户程序全部用完,那么用户程序再向内核申请内存时,内核也无法再给这个用户程序分配内存了,即便此时物理内存中还有充裕的空闲区域可供虚拟内存进行映射。
现有技术中提供了一种允许内核空间和用户空间交叠(overlap)的方式,使得用户空间的高部分和内核空间的低部分发生部分或全部重叠。用户程序通过用户映射访问重叠区域;内核通过内核映射访问重叠区域。这样就使得重叠区域内的同一个虚拟地址在内核中被访问和在用户程序中被访问时,可以对应到不同的物理地址。这样就既能拓宽用户空间大小,又能避免和内核空间冲突了。但是此种实现方式必须改变硬件CPU,且由于内核在正常运行时不可避免地要访问用户空间,因而需要引入新的指令,通过这些新指令,内核才能在内核态下透过用户映射而非内核映射访问重叠区域(也就是说,旧有的指令在内核态下使用的是内核映射)。因而,需要提供一种实现方式满足在不改变硬件的情况实现用户空间的扩展。
发明内容
本申请提供一种页面异常处理方法及装置,能够满足在不改变硬件的情况实现用户空间的扩展。
第一方面,本申请实施例提供一种页面异常处理方法,该方法可以由页面异常处理装置执行,该页面异常处理装置可以是一个终端设备或用于终端设备的模块,或者是一个服务器或用于服务器的模块。本申请对该方法的执行主体不做限定。该方法包括:内核接收用户程序触发的页面异常;确定所述页面异常对应的访存地址位于内核空间,且所述用户程序具有访问所述访存地址对应页面的访问权限后,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令。
上述方案,一方面,不再无条件将访问内核空间视作内存误用,也就是说允许用户程序的页表同时涵盖用户空间和内核空间,当然,这不意味着页表在刚建立的时候就要立刻涵盖这么多,而是说要预留足够的空间用于储存更大的页表,页表变得更大了是因为其涵盖内核空间。另一方面,当页面异常对应的访存地址位于内核空间,由于用户程序不能访问内核空间,因此通过内核模拟执行用户程序中触发页面异常的指令,无需改变硬件CPU或者引入新的指令,就可以有效解决页面异常对应的访存地址位于内核空间带来的异常,进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,所述内核确定所述用户程序中触发所述页面异常的第一指令;所述内核获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;所述内核模拟执行所述第一指令及所述N条指令。
上述方案,由于用户程序放置在扩展内核空间中的每条指令都一定会引发页面异常而需要内核进行 trap-and-emulate,因此,基于程序一般都是线性执行的假设(即,除非遇到跳转和分支,否则程序都是从前往后执行的),很有可能后面数条指令都位于扩展内核空间。这种情况下,如果只 trap-and-emulate 一条指令就返回,还会立刻再度发生页面异常而又要进行 trap-and-emulate。因此,可以令内核多取出N条后续的指令,一并完成模拟后,才返回用户程序。因此可以减少再度发生页面异常而又要进行 trap-and-emulate的可能性。
一种可能的实现方法中,所述内核判断模拟执行所述指令得到的模拟结果是否引发其他异常;若所述模拟结果引发其他异常且其他异常能够被所述内核修正,则所述内核在其他异常处理完成后,根据所述指令模拟处理所述模拟结果;若所述模拟结果不引发其他异常,则所述内核根据所述指令模拟处理所述模拟结果。
上述方案,在确定不引发其他异常,或者其他异常处理完成之后,通过内核模拟处理该模拟结果,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,所述内核确定所述访存地址对应的页面已分配且所述用户程序满足页面权限;所述内核确定所述页面异常对应的访存地址不位于用户空间;所述内核确定所述页面异常对应的访存地址位于内核空间。
上述方案,能够准确确定该页面异常并非内存误用,且能够准确确定页面异常对应的访存地址位于内核空间,也即该用户程序采用了扩展用户空间,因此,能够实现准确处理该页面异常。
一种可能的实现方法中,所述内核判断所述访存地址对应的页面是否存在对应的物理地址;若不存在,则建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,若所述访存地址所对应的页面为新分配的,则在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系;若所述访存地址所对应的页面已被换出到外存,则在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
上述方案, 能够实现准确有效地建立扩展用户空间页面映射。
一种可能的实现方法中,若所述指令需要从内核空间读取数据,则所述内核根据所述访存地址和对应的页表项,确定待读取的物理地址;根据所述待读取的物理地址,读取数据;若所述指令无需从内核空间读取数据,则所述内核从所述指令指定的寄存器和/或用户空间读取数据;对读取后的数据执行所述指令。
上述方案,通过内核模拟读取内存操作,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,若所述模拟结果需写入内核空间,则根据所述访存地址和对应的页表项,确定待写入的物理地址;将所述模拟结果写入所述待写入的物理地址对应的物理内存中;若所述模拟结果无需写入内核空间,则将所述模拟结果写入所述指令指定的寄存器或用户空间。
上述方案,通过内核模拟写入内存操作,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,返回所述用户程序的第二指令处或跳转指令对应的目的地址继续执行;所述第二指令为所述指令的下一条指令。
上述方案,由于为用户程序提供在内核空间执行的 trap-and-emulate,对页面异常做出了特别处理,也即模拟执行了该异常指令,所以应当返回该指令的下一条指令处或跳转指令对应的目的地址继续执行,确保程序执行的准确性。
一种可能的实现方法中,所述内核获取所述用户程序触发的内存分配请求;所述内核确定可用内存总量大于所述内存分配请求指示的内存大小;所述可用内存为物理内存和/或交换内存;所述内核查询所述用户程序对应的进程页表,从所述进程页表中确定大于所述内存分配请求指示的内存大小的连续区域;所述连续区域位于用户空间或内核空间;所述内核将所述连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述连续区域对应的起始地址。
上述方案,能够实现准确有效地为用户程序分配内存。
一种可能的实现方法中,判断所述进程页表是否存在第一连续区域,所述第一连续区域位于用户空间,且第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小;若所述进程页表不存在所述第一连续区域,判断所述进程页表是否存在第二连续区域,所述第二连续区域位于内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小。
上述方案,若用户空间不满足用户程序所需的内存,允许内核在查找进程的空闲虚拟内存时,可以在内核空间内查找,因此,能够实现使用内核空间,扩展用户程序可用内存。
第二方面,本申请实施例提供一种页面异常处理装置,包括:接收单元和处理单元。接收单元,用于接收用户程序触发的页面异常;处理单元,用于确定所述页面异常对应的访存地址位于内核空间,且所述用户程序具有访问所述访存地址对应页面的访问权限后,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令。
一种可能的实现方法中,处理单元,用于确定所述用户程序中触发所述页面异常的第一指令;所述内核获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;所述内核模拟执行所述第一指令及所述N条指令。
一种可能的实现方法中,处理单元,用于判断模拟执行所述指令得到的模拟结果是否引发其他异常;若所述模拟结果引发其他异常且其他异常能够被所述内核修正,则所述内核在其他异常处理完成后,根据所述指令模拟处理所述模拟结果;若所述模拟结果不引发其他异常,则所述内核根据所述指令模拟处理所述模拟结果。
一种可能的实现方法中,处理单元,用于确定所述访存地址对应的页面已分配且所述用户程序满足页面权限;所述内核确定所述页面异常对应的访存地址不位于用户空间;所述内核确定所述页面异常对应的访存地址位于内核空间。
一种可能的实现方法中,处理单元,用于判断所述访存地址对应的页面是否存在对应的物理地址;若不存在,则建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,若所述访存地址所对应的页面为新分配的,处理单元,用于在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系;若所述访存地址所对应的页面已被换出到外存,处理单元,用于在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,若所述指令需要从内核空间读取数据,则处理单元,用于根据所述访存地址和对应的页表项,确定待读取的物理地址;根据所述待读取的物理地址,读取数据;若所述指令无需从内核空间读取数据,则处理单元,用于从所述指令指定的寄存器和/或用户空间读取数据;对读取后的数据执行所述指令。
一种可能的实现方法中,若所述模拟结果需写入内核空间,处理单元,用于根据所述访存地址和对应的页表项,确定待写入的物理地址;将所述模拟结果写入所述待写入的物理地址对应的物理内存中;若所述模拟结果无需写入内核空间,处理单元,用于将所述模拟结果写入所述指令指定的寄存器或用户空间。
一种可能的实现方法中,处理单元,用于返回所述用户程序的第二指令处或跳转指令对应的目的地址继续执行;所述第二指令为所述指令的下一条指令。
一种可能的实现方法中,处理单元,用于获取所述用户程序触发的内存分配请求;所述内核确定可用内存总量大于所述内存分配请求指示的内存大小;所述可用内存为物理内存和/或交换内存;所述内核查询所述用户程序对应的进程页表,从所述进程页表中确定大于所述内存分配请求指示的内存大小的连续区域;所述连续区域位于用户空间或内核空间;所述内核将所述连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述连续区域对应的起始地址。
一种可能的实现方法中,处理单元,用于判断所述进程页表是否存在第一连续区域,所述第一连续区域位于用户空间,且第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小;若所述进程页表不存在所述第一连续区域,判断所述进程页表是否存在第二连续区域,所述第二连续区域位于内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小。
第三方面,本申请实施例还提供一种计算设备,包括:
存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行实现上述第一方面的任意方法。
第四方面,本申请实施例还提供一种计算机可读存储介质,其中存储有计算机可读指令,当计算机读取并执行所述计算机可读指令时,实现上述第一方面的任意方法。
第五方面,本申请实施例提供了一种计算机程序产品,包括有可由计算机设备执行的计算机程序,当所述程序在计算机设备上运行时,使得所述计算机设备执行实现上述第一方面的任意方法。
附图说明
图1为本申请实施例提供的一种内核空间和用户空间划分的结构示意图;
图2为本申请实施例提供的一种页面异常处理方法的流程示意图;
图3为本申请实施例提供的一种内存分配方法的流程示意图;
图4为本申请实施例提供的一种页面异常处理方法的流程示意图;
图5为本申请实施例提供的一种页面异常处理方法的流程示意图;
图6为本申请实施例提供的一种页面异常处理方法的流程示意图;
图7为本申请实施例提供的一种页面异常处理方法的流程示意图;
图8为本申请实施例提供的一种页面异常处理方法的流程示意图;
图9为本申请实施例提供的一种页面异常处理装置的结构示意图;
图10为本申请实施例提供的一种页面异常处理装置的结构示意图。
具体实施方式
下面对本申请使用的部分专业术语进行解释。
内核(Kernel,又称核心):在计算机科学中是一个用来管理软件发出的资料I/O(输入与输出)要求的电脑程序,将这些要求转译为资料处理的指令并交由中央处理器(CPU)及电脑中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。有了这个,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。总结起来,由于用户程序是不可任意信任的,因此涉及到硬件的操作都必须由内核接管,用户程序要进行这样的操作就必须与内核提供的抽象层交互。有时候我们会说「内核态」,强调 CPU 的一种状态,这个状态具有高特权,用于运行内核。实务上这个词和「内核」基本上可以理解为同义词。操作系统大多数时候就是指操作系统内核。
异常、陷阱 (trap) 和中断:程序执行过程中,遇到 CPU 自身不能处理的错误,就会引发异常。异常会使 CPU 陷入内核态,并交由内核处理异常,异常处理后,还会返回用户态。陷阱有时用来指代有意引发的异常,如当用户态程序需要和内核交互时,会通过系统调用(syscall)使得 CPU 陷入内核态以便内核处理来自用户态程序的请求,处理完成后,还会返回用户态。从 CPU 的角度看,异常和陷阱是几乎完全一样的。中断是由外部事件引发的(也就是说,不是 CPU 上执行的程序引发的),这些外部事件通常来自时钟或外部硬件,是不可预期的。中断的到来会使得 CPU 陷入内核态,交由内核处理中断(也就是处理来自外部的请求),处理完成也会返回用户态。许多技术人员,尤其是x86的技术人员,因为这三者有很多实质性共同点,喜欢把这三者都称为「中断」。本申请主要采取MIPS的习惯,异常和陷阱几乎是同义词,中断则是特指外部事件引发的。
用户程序:与内核相对的,运行在「用户态」的程序。也就是我们平常说的「进程」(强调程序正在运行)、「程序」、「软件」。「用户态」,强调 CPU 的一种状态,这个状态不具有特权,可进行的操作受限,用于运行用户程序,实务上这个词和「用户程序」基本上可以理解为同义词。
物理内存/虚拟内存:由于用户程序不应当能够直接访问物理内存(否则其特权就过高了),有必要建立一种映射,让用户程序间接访问物理内存。另一方面,由于操作系统需要能够运行无数个进程,因此也需要这样一层映射让所有程序都能在相同的地址空间上运行。建立映射后,用户程序所使用的内存地址就称作虚拟内存地址或虚拟地址(virtualaddress)。
地址空间:无论是虚拟内存还是物理内存,我们都需要使用内存地址来确定将要访问的具体位置。地址的宽度决定了可访问的最大内存大小。实际上,当我们说一个 CPU是「xx 位」的时候,指的是它的虚拟地址的宽度。而物理地址的宽度(实际上是地址总线的宽度)则不一定和虚拟地址的宽度等同,比如,32 位 CPU 有可能为了支持更大的物理内存(大于 4GiB),使其物理地址大于 32 位;而因为 64 位所能编码的地址空间实在是太大了,可见的未来还无法实现这么大的内存,所以一般来说 64 位 CPU 的物理地址的宽度不会超过 50 位(已经能编码1PiB = 1024 TiB = 1048576 GiB 的物理内存了)。
内核空间/用户空间:虚拟内存被分为内核空间(kernel space)和用户空间(userspace)两个区段。由于内核与用户程序都需要内存才能运行,因此它们都需要占据一定的虚拟内存空间。因此,其实也可以说,内核运行在内核空间上,用户程序运行在用户空间上。内核由于其特权,可以访问用户空间;用户空间由于缺乏特权,访问内核空间将引发异常。两个空间在虚拟内存中占据的大小通常是架构特定的,图1展示了 32 位MIPS指令集架构的内核空间和用户空间划分。可见内核空间和用户空间均分了 4GiB 的 32 位虚拟内存空间,各自分到高 2GiB(0x80000000~0xFFFFFFFF)和低 2GiB(0x0~0x7FFFFFFF),且互不重叠。对于 x86,内核空间占用高 1GiB,用户空间占用低 3GiB。下文中,内核空间的映射称其为内核映射,用户空间的映射我们称其为用户映射。内核映射一般来说只有一份,这是因为只能同时运行一个内核。用户映射则是每个进程各自有一个。
内存分页:虚拟内存中最重要的一项技术之一。因为操作系统可以运行无数个进程,这些进程所使用的总内存量可能大于物理内存的容量,因此有必要使用外存(通常是硬盘)来进行交换(swap,又叫分页文件/页面文件 page file 或交换文件 swap file)。因此催生了分页(paging),分页通常实作为页表(page table)。页表的最细粒度为页表项(pagetable entry,PTE,简称为页 page),一页所能管理的内存大小通常是 4KiB,这也是内存管理的最细粒度。页表描述了对于一个特定的进程,其虚拟地址应当被如何映射到物理地址。操作系统为不同的进程建立各自的页表,它们是不共享的(也就是说,同一个用户空间地址,在不同进程的页表中,其映射是不一致的)。页表还描述了,对于一个特定的页,其是否驻留(resident)在内存上。如果一个进程访问了一个不驻留在内存上的分页内的虚拟地址(「缺页」),就会产生页面异常(page fault,常被称为「缺页中断」,这是一个惯用表达,并不是只有缺页才能引发此类异常,因此本申请不采用这个容易引起误解的翻译),导致 CPU进入内核态,由内核将储存在交换中的页读进内存中,然后返回用户态继续执行。
缺页:指用户程序访问了一个不存在有效映射的虚拟地址。缺页需要由内核来修正,上面就讲了其中一种情形,还有一种情形是内存分配后首次访问。并非所有的缺页情形都可被内核修正,比如说,如果用户程序访问的这个虚拟地址所在的页面根本没有被分配,那么就是一种内存误用,应当导致段错误。
地址翻译:由于访存最终都要落实到物理内存之上,从而虚拟地址必须以某种方式被翻译为物理地址。地址翻译其实就是以某种方式解析并查询页表中的地址映射。地址翻译是 CPU 中的内存管理单元 MMU 的职责,它独立或在内核协助下解析并查询页表。页表中可能为页面指定了权限(可读、可写、可执行等),MMU 也要负责在用户程序执行了超出页面权限的操作时,引发页面异常。如果页表中不存在相应的地址映射,或者用户程序访问了内核空间,它也要引发页面异常。但需要注意的是,在内核态时,访问内核空间,是可以正常进行地址翻译的。
内存耗尽(out of memory,OOM,又称「内存溢出」):操作系统(内核)所能提供的最大内存数量是物理内存的大小加上交换的大小。如果它们都接近被分配完,此时还能提供的内存就相当少了,从而导致用户程序的内存申请无法被满足,此时就进入 OOM 状态。此时内核已经走投无路,只能挑选一个占用内存最多的进程,将其杀死,以解除 OOM 状态。前面已经提到,虚拟内存空间分为内核空间和用户空间。一个用户程序所能使用的最大内存空间取决于用户空间的大小,比如在 32 位 MIPS 上是 2GiB。如果这 2GiB 已经全部用完,那么用户程序再向内核申请内存时,即使物理内存和交换都还很充足,内核也无法再给这个程序分配内存了。此时只能给这个进程返回一个错误,让用户程序自行处理(用户程序可能选择退出,也可能选择自行清理已使用的内存)。
段错误(Segment Fault):段错误是一个内核提供给用户程序的抽象。内核将段错误作为一种信号发送给进程。用户程序可以选择自行处理段错误,不过这是非常困难的,所以一般来说程序只能选择立即退出以免造成更严重的后果。基本上,除了缺页以外,其他原因导致的页面异常都是由于某种内存误用(misusage),或者说,属于软件的缺陷,因此都应该导致段错误,并最终导致程序退出。
内存误用:所谓误用,即是指 misusage,意在指代用户程序错误地使用了内存。从结果上讲,内存误用会导致:MMU 引发页面异常 -> 内核处理页面异常 -> 内核认为这个页面异常无法被修正 -> 向程序发送段错误信号。从过程上讲,一般是用户程序:1)访问了内核空间;2)访问了未分配的页面;3)所执行操作不匹配页面权限。
程序计数器(Program Counter,PC):在 x86 的习惯里又叫做 InstructionPointer(指令指针,IP),指的是 CPU 内的一个寄存器,其储存着 CPU 下一条将要执行的指令所在的内存地址(一般来说是虚拟地址)。也就是说,PC 指向的那条指令其实还没有被执行,而是下一步将要执行的。如果没有遇到分支和跳转,PC 的值会随着程序执行单调递增,也就是说,会一直指向当前指令的下一条指令所在的地址;然而,分支和跳转会改变 PC的值,使其不指向当前指令的下一条指令所在的地址,而是指向分支/跳转指令所指定的目的地址(destination)。
异常程序计数器(Exception Program Counter,EPC):这是 MIPS 指令集定义的一个寄存器,但在别的指令集中可能有不同的名字;有的指令集也可能不提供这个寄存器,而是通过在异常处理时自动读写内核栈中的异常帧来实现。这个寄存器储存的是引发异常的那条指令所在的内存地址。也就是说,EPC 指向的那条指令其实相当于还没有被执行,或者说,由于引发了异常,所有状态都被 CPU 自动回滚到这条指令被执行之前的状态(「精确异常」)。这个寄存器的存在有两个意义:1)内核处理异常后常常需要返回原来的位置,CPU在异常返回时就读取这个寄存器并改变 PC;2)有时候内核处理异常会需要改变返回的位置,如trap-and-emulate,常常需要在返回时跳过一条指令,那么内核就修改这个寄存器的值;3)内核经常需要读取 EPC 来确定如何进行异常处理,trap-and-emulate 就是其中一个例子,内核必须读取 EPC 然后读取 EPC 指向的那条指令,才能进一步解析并模拟那条指令,另一个例子是,正如前面所说,内存误用包括页面权限不匹配,其中一种情况就是尝试跳转到不可执行页上的地址,这时候,其实 EPC 会指向跳转后的目的地址,因此,内核只需要判断 EPC 指向的地址所在的页面是否可执行,就知道是不是内存误用了。
trap-and-emulate:为「捕获并模拟」。某些指令执行时,会因为种种原因引发异常而需要内核来处理。通常情况下,这些异常是我们不希望见到的,如果出现,则意味着程序存在缺陷,内核处理异常的最终结果因此常常是破坏性的,如杀死该进程。然而,有一种例外情况,即,我们不希望见到这种异常,但这个异常并非由程序的缺陷引起,而是某种不可抗力引发的。这种情况下,我们会希望程序仍然可以正常运行,此时内核需要对引发异常的指令进行模拟,模拟的结果就如同它被正确执行一样。一种典型的情况就是,出于节省成本的考虑,CPU 中省去了 FPU(浮点运算单元),从而用户程序执行的浮点运算指令将引发异常,此时我们当然希望内核为它模拟这条浮点运算指令。这里 trap 的意思就是指内核捕获异常,emulate 就是指内核在处理异常时,对引发异常的指令进行模拟。trap-and-emulate 是一种对用户态完全透明的模拟,也就是说,用户程序不会知道一条指令是否经过了 trap-and-emulate,也不需要做出任何修改就能受益于它。通常而言,因为引发异常的那条指令已经被内核所模拟,内核在异常返回前,要修改 EPC,使其指向引发异常的那条指令的下一条指令(如果模拟的是分支/跳转指令,那也可能改为跳转的目的地址)。
图2为本申请实施例提供的一种页面异常处理方法的流程示意图,该方法可以由页面异常处理装置执行,该页面异常处理装置可以是一个终端设备或用于终端设备的模块,或者是一个服务器或用于服务器的模块。本申请对该方法的执行主体不做限定。
该方法包括以下步骤:
步骤201,内核接收用户程序触发的页面异常。
一种可能的实现方法中,页面异常指的是缺页异常,缺页异常指的是用户程序访问了一个不存在有效映射的虚拟地址,或者是内存分配后首次访问。缺页异常由内核来完成修正。内核分配内存仅仅是修改页表,并未为对应的虚拟内存区域真正建立到物理内存的映射(懒分配/延迟分配)。相反,要到用户程序真正访问了刚刚申请的内存区域的时候,引发缺页异常,陷入内核态,再由内核完成这一映射即分配内存后首次使用。这是因为,用户程序常常申请超过其需求的内存,有些被申请的内存区域直到程序退出都可能没有被真正用过,因此等用户程序真正访问了刚刚申请的内存区域的时,才为对应的虚拟内存区域建立到物理内存的映射。
步骤202,确定所述页面异常对应的访存地址位于内核空间,且所述用户程序具有访问所述访存地址对应页面的访问权限后,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令。
一种可能的实现方法中,通过trap-and-emulate方式模拟执行触发页面异常的指令;trap-and-emulate 是一种对用户态完全透明的模拟,也就是说,用户程序不会知道一条指令是否经过了 trap-and-emulate,也不需要做出任何修改就能受益于它, 模拟的结果就如同它被正确执行一样。
一种可能的实现方法中,所述模拟执行所述指令之后,还包括:内核判断模拟执行所述指令得到的模拟结果是否引发其他异常;若所述模拟结果引发其他异常且其他异常能够被所述内核修正,则所述内核在其他异常处理完成后,根据所述指令模拟处理所述模拟结果;若所述模拟结果不引发其他异常,则所述内核根据所述指令模拟处理所述模拟结果;若所述模拟结果引发其他异常但其他异常不能被所述内核修正,则向所述用户程序返回由其他异常引发的异常信号。该方案,在确定不引发其他异常,或者其他异常处理完成之后,通过内核模拟处理该模拟结果,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,若所述模拟结果需写入内核空间,则根据所述访存地址和对应的页表项,确定待写入的物理地址;将所述模拟结果写入所述待写入的物理地址对应的物理内存中;若所述模拟结果无需写入内核空间,则将所述模拟结果写入所述指令指定的寄存器或用户空间。该方案,通过内核模拟写入内存操作,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,根据所述指令模拟处理所述模拟结果之后,内核返回所述用户程序的第二指令处或跳转指令对应的目的地址继续执行;所述第二指令为所述指令的下一条指令。因为引发异常的那条指令已经被内核所模拟,内核在异常返回前,要修改EPC,使其指向引发异常的那条指令的下一条指令(如果模拟的是分支/跳转指令,那也可能改为跳转的目的地址)。
上述方案,一方面,不再无条件将访问内核空间视作内存误用,也就是说允许用户程序的页表同时涵盖用户空间和内核空间,当然,这不意味着页表在刚建立的时候就要立刻涵盖这么多,而是说要预留足够的空间用于储存更大的页表,页表变得更大了是因为其涵盖内核空间。另一方面,当页面异常对应的访存地址位于内核空间,由于用户程序不能访问内核空间,因此通过内核模拟执行用户程序中触发页面异常的指令,无需改变硬件CPU或者引入新的指令,就可以有效解决页面异常对应的访存地址位于内核空间带来的异常,进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,上述步骤201之前,还包括根据用户程序触发的内存分配请求,为用户程序分配内存,该过程如图3所示,包括以下步骤:
步骤301,内核获取所述用户程序触发的内存分配请求。
一种可能的实现方法中,用户程序向内核请求分配特定大小的一段内存,值得说明的是,用户程序常常申请超过其需求的内存。
步骤302,内核判断可用内存总量是否大于等于内存分配请求指示的内存大小。
一种可能的实现方法中,内存总量指的是物理内存和交换内存的总和,可用内存指的是未分配的物理内存和交换内存。
一种可能的实现方法中,若内存总量小于内存分配请求指示的内存大小,向所述用户程序返回第一异常信号;所述第一异常信号用于指示内存溢出。
一种可能的实现方法中,若内存总量大于等于内存分配请求指示的内存大小,则执行步骤303。
步骤303,判断所述进程页表是否存在第一连续区域。
其中,第一连续区域位于用户空间,且第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小。
一种可能的实现方法中,内核查询所述用户程序对应的进程页表,在该进程的用户空间寻找一块比该进程所需的内存大的连续区域,即第一连续区域;若未找到第一连续区域,则执行步骤304;若找到第一连续区域,则执行步骤305。
步骤304,判断所述进程页表是否存在第二连续区域。
其中,第二连续区域位于内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小。
一种可能的实现方法中,内核查询进程页表,在该进程的扩展用户空间(也即内核空间)寻找一块比该进程所需的内存大的连续区域,即第二连续区域;若找到第二连续区域,则执行步骤305;若未找到第二连续区域,向所述用户程序返回第二异常信号;所述第二异常信号用于指示内存溢出。
步骤305,内核将所述连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述连续区域对应的起始地址。
其中,所述连续区域位于用户空间或内核空间。
上述方案,能够实现准确有效地为用户程序分配内存,若用户空间不满足用户程序所需的内存,允许内核在查找进程的空闲虚拟内存时,可以在内核空间内查找,因此,能够实现使用内核空间,扩展用户程序可用内存。
一种可能的实现方法中,上述步骤202中,确定页面异常对应的访存地址位于内核空间之前,还包括以下步骤,该步骤如图4所示:
步骤401,判断异常类型,取出引发异常的访存地址。
一种可能的实现方法中,判断异常类型实际上是指判断这个异常是不是页面异常,因为实际的 CPU 一般会使用同一个异常处理入口点处理很多种异常。若异常类型为页面异常,则取出引发异常的访存地址,并执行步骤402。
步骤402,取出该访存地址对应的页表项。
步骤403,判断该访存地址对应的页面是否已分配。
一种可能的实现方法中,访存地址对应的页面已分配指的是上述步骤301至步骤305中,内核确定进程页表存在连续区域,将连续区域对应的页面的状态设置为已分配。若该访存地址对应的页面已分配,则执行步骤404;若该访存地址对应的页面未分配,则向所述用户程序返回第三异常信号;所述第三异常信号为段错误,用于指示页面未分配带来的内存误用。
步骤404,判断程序行为是否合乎页面权限。
一种可能的实现方法中,不合乎页面权限包括尝试在只读页面进行写操作,或尝试跳转到不可执行页继续执行等,本申请对此不做限定。
一种可能的实现方法中,若程序行为合乎页面权限,则执行步骤405;若程序行为不合乎页面权限,则向所述用户程序返回第四异常信号;所述第四异常信号为段错误,用于指示程序行为不合乎页面权限带来的内存误用。
步骤405,判断该访存地址是否位于用户空间。
一种可能的实现方法中,若该访存地址位于用户空间,则执行步骤407;若该访存地址不位于用户空间,则执行步骤406。
步骤406,判断该访存地址是否位于内核空间。
一种可能的实现方法中,若该访存地址位于内核空间,获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令;若该访存地址不位于内核空间,则向所述用户程序返回第五异常信号;所述第五异常信号为段错误,用于指示访问地址不在用户空间和内核空间带来的内存误用。
步骤407,判断该访存地址对应的页面是否已使用。
一种可能的实现方法中,若该访存地址对应的页面未使用,即分配内存后首次使用,则执行步骤408。若该访存地址对应的页面已使用,即其已被换出到外存,则执行步骤409。
步骤408,在物理内存中寻找一个空闲的物理页面,建立用户空间页面映射。
一种可能的实现方法中,若所述访存地址所对应的页面为新分配的,则在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
步骤409,在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面(换入)后,建立访存地址对应的页面与物理页面的用户空间映射关系。
一种可能的实现方法中,该访存地址所对应的页面已被换出(swap out)到外存,则在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面(换入swap in),建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,缺页的情形涉及到在物理内存中寻找空闲的物理页面,如果空闲页面不足,就需要将某些页面换出(写入交换,并腾出物理内存)。读取交换中的内存数据,写入到一个空闲的物理页面后,建立用户空间页面映射关系。
一种可能的实现方法中,建立页面映射具体而言是,修改对应的页表项,向其写入先前已经寻找到的空闲物理页面的物理页号。有需要的话,还会修改其权限位之类的标志位。尽管建立页面映射只是修改了页表,看起来好像只是某种数据修改,但这个修改将会影响硬件行为。
步骤410,返回用户程序原先执行到的位置。
一种可能的实现方法中,确定该页面异常是缺页而并非内存误用,建立用户空间页面映射关系后,返回用户程序原先执行到的位置继续执行。
上述方案,能够准确确定该页面异常并非内存误用,且能够准确确定页面异常对应的访存地址位于内核空间,也即该用户程序采用了扩展用户空间,进一步地,能够实现准确处理该页面异常。
一种可能的实现方法中,上述步骤406确定访存地址位于内核空间之后,还包括以下步骤,该过程如图5所示。
步骤501,判断该访存地址对应的页面是否已使用。
一种可能的实现方法中,若该访存地址对应的页面未使用,即分配内存后首次使用,则执行步骤502。若该访存地址对应的页面已使用,则执行步骤503。
步骤502,在物理内存中寻找一个空闲的物理页面,建立内核空间页面映射。
一种可能的实现方法中,该访存地址所对应的页面为新分配的,则在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
步骤503,判断该页面是否在交换中。
一种可能的实现方法中,若该页面在交换中,则执行步骤504。若该页面不在交换中,则执行步骤505。
步骤504,从交换中换入页面。
一种可能的实现方法中,在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面(换入)后,建立内核空间页面映射关系。执行步骤505。步骤505,模拟执行。
一种可能的实现方法中,在进程的页表中为扩展用户空间所建立的任何页面映射,都无法被 MMU 使用,这是由于,内核态下使用的是内核页表(访问内核空间时)和进程的用户页表(访问用户空间时)。而扩展用户空间由于与内核空间交叠,如果直接访问,MMU只会使用内核页表来进行地址翻译,因此需要让内核代行 MMU 的职责,内核模拟执行指令时,在得出应当被访问的虚拟地址以后,由内核查询该进程的扩展用户空间的页表,得出应当被访问的物理地址,再通过一些方式访问这个物理地址。一些方式一般来说,要么通过内核空间的直接映射窗口(内核空间中有一段空间,是直接通过加上一个偏移量映射到物理内存的)访问,要么通过在内核页表中建立一个临时映射来访问。
上述方案, 能够实现准确有效地建立扩展用户空间页面映射。
一种可能的实现方法中,上述步骤505以下步骤,该过程如图6所示。
步骤601,获取所述用户程序中触发页面异常的指令。
步骤602,模拟该指令,得到模拟结果。
步骤603,判断模拟结果是否引发其他异常。
一种可能的实现方法中,若模拟结果引发其他异常,则执行步骤604;若模拟结果没有引发其他异常,则执行步骤605。
步骤604,处理其他异常。
一种可能的实现方法中,内核在其他异常处理完成后,也即该其他异常能够被修正,则根据该指令处理模拟结果,即执行步骤605。本申请对其他异常不做限定,对处理其他异常的方法也不做限定。
一种可能的实现方法中,若其他异常不能被修正,则发送其他错误信号。
步骤605,模拟处理模拟结果。
步骤606,返回用户程序的第二指令处或跳转指令对应的目的地址继续执行。
其中,第二指令为该指令的下一条指令。
一种可能的实现方法中,由于本申请为用户程序提供在内核空间执行的 trap-and-emulate,对页面异常做出特别处理,也即模拟执行了该异常指令,所以应当返回该指令的下一条指令处或跳转指令对应的目的地址继续执行。
上述方案,在确定不引发其他异常,或者其他异常处理完成之后,通过内核模拟处理该模拟结果,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,所述内核确定用户程序中触发页面异常的第一指令;内核获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;所述内核模拟执行所述第一指令及所述N条指令。由于用户程序放置在扩展内核空间中的每条指令都一定会引发页面异常而需要内核进行 trap-and-emulate,因此,基于程序一般都是线性执行的假设(即,除非遇到跳转和分支,否则程序都是从前往后执行的),很有可能后面数条指令都位于扩展内核空间。这种情况下,如果只 trap-and-emulate 一条指令就返回,还会立刻再度发生页面异常而又要进行 trap-and-emulate。因此,我们可以令内核多取出几条后续的指令,一并完成模拟后,才返回用户程序。这个「几条」到底要是多少,在这里没有限定,只是说,这个数字不应该太大,因为通常来说我们不希望长时间停留在内核态,这样会导致(别的)用户程序长时间得不到调度,进而导致系统停顿,或者通俗来说卡顿。
一种可能的实现方法中,上述步骤602,模拟该指令,得到模拟结果,包括以下步骤,该过程如图7所示。
步骤701,解析该指令,确定其行为。
一种可能的实现方法中,确定其行为为读取数据。数据输入,可能来自寄存器、内存(可细分为用户空间和内核空间)或立即数(即内嵌在指令机器码中的数据,解析指令后就立刻知道这个数据了)。数据输出,可能会输出到寄存器或内存。
根据这些数据流向,指令模拟时可能需要进行扩展用户空间的模拟访存。
步骤702,判断是否从内核空间读取数据。
一种可能的实现方法中,若确定从内核空间读取数据,则执行步骤704和步骤705;若确定从用户空间读取数据,则执行步骤703。
步骤703,从指令指定的寄存器和/或用户空间读取数据。
一种可能的实现方法中,根据解析出来的指令行为,从该指令所需读取的寄存器和/或用户空间地址读出数据。
步骤704,根据访存地址和对应的页表项,确定待读取的物理地址。
一种可能的实现方法中,根据先前已经取出的访存地址和对应的页表项,得出应当访问的物理地址。
步骤705,根据待读取的物理地址,读取数据。
一种可能的实现方法中,以一定方式访问该物理地址,完成读取。一定方式一般来说,要么通过内核空间的直接映射窗口(内核空间中有一段空间,是直接通过加上一个偏移量映射到物理内存的)访问,要么通过在内核页表中建立一个临时映射来访问。
步骤706,确定模拟结果。
一种可能的实现方法中,模拟该指令的行为,得出模拟结果。
上述方案,通过内核模拟读取内存操作,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,上述步骤605,模拟处理模拟结果,包括以下步骤,该过程如图8所示。
步骤801,判断是否将模拟结果写入内核空间。
一种可能的实现方法中,若确定将模拟结果写入内核空间,则执行步骤803和步骤804;若确定将模拟结果写入用户空间,则执行步骤802。
步骤802,写入指定的寄存器和/或用户空间。
一种可能的实现方法中,根据解析出来的指令行为,将模拟结果写入该指令所指定的目标寄存器和/或用户空间地址。
步骤803,根据访存地址和对应的页表项,确定待写入的物理地址。
一种可能的实现方法中,根据先前已经取出的访存地址和对应的页表项,得出应当访问的物理地址。
步骤804,根据待写入的物理地址,写入数据。
一种可能的实现方法中,以一定方式访问该物理地址,完成写入。
上述方案,通过内核模拟写入内存操作,无需改变硬件CPU或者引入新的指令,就可以有效处理模拟结果;进一步地,能够满足在不改变硬件的情况实现用户空间的扩展。
一种可能的实现方法中,本申请能够在 32 位等宽度不足的架构之下,进一步扩宽用户程序所能使用的最大内存空间,且不需要对用户程序和CPU做出任何修改,可以直接使用现有的二进制(可执行文件)。扩宽的程度,取决于应用到的指令集的内核空间有多大,比如,如果应用于 32 位 MIPS,那么就增加了 2GB 的扩展用户空间;如果应用于 32 位x86,那么就增加了 1GB。
就现实应用来讲,一个显著的例子是,能够解决原生编译时,由于编译器(工具链)耗尽内存而导致某些大型软件无法被成功编译的问题。但显然还可以有更多用途从中收益。比如,如果一个程序所需使用的内存大小随着其所处理的数据量的增加而急剧增加,那么其可以处理的最大数据量就受到用户空间大小的掣肘,本申请能够增大其可处理的最大数据量;特别是,在因为现实原因无法将该程序重新编译为 64 位的情形下。
基于相同的技术构思,图9示例性地示出了本申请实施例提供的一种页面异常处理装置 900。如图9所示,包括:包括:接收单元901和处理单元902。接收单元901,用于接收用户程序触发的页面异常;处理单元902,用于确定所述页面异常对应的访存地址位于内核空间,且所述用户程序具有访问所述访存地址对应页面的访问权限后,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令。
一种可能的实现方法中,处理单元902,用于确定所述用户程序中触发所述页面异常的第一指令;所述内核获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;所述内核模拟执行所述第一指令及所述N条指令。
一种可能的实现方法中,处理单元902,用于判断模拟执行所述指令得到的模拟结果是否引发其他异常;若所述模拟结果引发其他异常且其他异常能够被所述内核修正,则所述内核在其他异常处理完成后,根据所述指令模拟处理所述模拟结果;若所述模拟结果不引发其他异常,则所述内核根据所述指令模拟处理所述模拟结果。
一种可能的实现方法中,处理单元902,用于确定所述访存地址对应的页面已分配且所述用户程序满足页面权限;所述内核确定所述页面异常对应的访存地址不位于用户空间;所述内核确定所述页面异常对应的访存地址位于内核空间。
一种可能的实现方法中,处理单元902,用于判断所述访存地址对应的页面是否存在对应的物理地址;若不存在,则建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,若所述访存地址所对应的页面为新分配的,处理单元902,用于在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系;若所述访存地址所对应的页面已被换出到外存,处理单元902,用于在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
一种可能的实现方法中,若所述指令需要从内核空间读取数据,则处理单元902,用于根据所述访存地址和对应的页表项,确定待读取的物理地址;根据所述待读取的物理地址,读取数据;若所述指令无需从内核空间读取数据,则处理单元902,用于从所述指令指定的寄存器和/或用户空间读取数据;对读取后的数据执行所述指令。
一种可能的实现方法中,若所述模拟结果需写入内核空间,处理单元902,用于根据所述访存地址和对应的页表项,确定待写入的物理地址;将所述模拟结果写入所述待写入的物理地址对应的物理内存中;若所述模拟结果无需写入内核空间,处理单元902,用于将所述模拟结果写入所述指令指定的寄存器或用户空间。
一种可能的实现方法中,处理单元902,用于返回所述用户程序的第二指令处或跳转指令对应的目的地址继续执行;所述第二指令为所述指令的下一条指令。
一种可能的实现方法中,处理单元902,用于获取所述用户程序触发的内存分配请求;所述内核确定可用内存总量大于所述内存分配请求指示的内存大小;所述可用内存为物理内存和/或交换内存;所述内核查询所述用户程序对应的进程页表,从所述进程页表中确定大于所述内存分配请求指示的内存大小的连续区域;所述连续区域位于用户空间或内核空间;所述内核将所述连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述连续区域对应的起始地址。
一种可能的实现方法中,处理单元902,用于判断所述进程页表是否存在第一连续区域,所述第一连续区域位于用户空间,且第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小;若所述进程页表不存在所述第一连续区域,判断所述进程页表是否存在第二连续区域,所述第二连续区域位于内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小。
基于相同的技术构思,本申请实施例提供了一种页面异常处理装置1000,该一种页面异常处理装置1000比如可以是一个计算设备。如图10所示,一种页面异常处理装置1000包括至少一个处理器1001,以及与至少一个处理器连接的存储器1002,本申请实施例中不限定处理器1001与存储器1002之间的具体连接介质,图10中处理器1001和存储器1002之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。
在本申请实施例中,存储器1002存储有可被至少一个处理器1001执行的指令,至少一个处理器1001通过执行存储器1002存储的指令,可以执行上述一种页面异常处理方法。
其中,处理器1001是一种页面异常处理装置1000的控制中心,可以利用各种接口和线路连接计算机设备的各个部分,通过运行或执行存储在存储器1002内的指令以及调用存储在存储器1002内的数据,从而进行资源设置。可选地,处理器1001可包括一个或多个确定单元,处理器1001可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器1001中。在一些实施例中,处理器1001和存储器1002可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器1001可以是通用处理器,例如中央处理器(CPU)、数字信号处理器、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器1002作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器1002可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(Random AccessMemory,RAM)、静态随机访问存储器(Static Random Access Memory,SRAM)、可编程只读存储器(Programmable Read Only Memory,PROM)、只读存储器(Read Only Memory,ROM)、带电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器1002是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本申请实施例中的存储器1002还可以是电路或者其他任意能够实现存储功能的装置,用于存储程序指令和/或数据。
本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质存储有计算机可执行程序,计算机可执行程序用于使计算机执行上述任一方式所列的一种页面异常处理方法。
本申请实施例提供了一种计算机程序产品,包括有可由计算机设备执行的计算机程序,当所述程序在计算机设备上运行时,使得所述计算机设备执行上述任一方式所列的一种页面异常处理方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (8)

1.一种页面异常处理方法,其特征在于,包括:
内核接收用户程序触发的页面异常;
所述内核确定所述页面异常对应的访存地址对应的页面已分配且所述用户程序满足页面权限;
所述内核确定所述页面异常对应的访存地址不位于用户空间;
所述内核确定所述页面异常对应的访存地址位于内核空间;
所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令;
其中,所述内核获取所述用户程序中触发所述页面异常的指令并模拟执行所述指令,包括:
所述内核确定所述用户程序中触发所述页面异常的第一指令;
所述内核获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;
所述内核模拟执行所述第一指令及所述N条指令;
在所述内核接收用户程序触发的页面异常之前,包括:
所述内核获取所述用户程序触发的内存分配请求;
所述内核确定可用内存总量大于所述内存分配请求指示的内存大小;所述可用内存为物理内存和/或交换内存;
所述内核查询所述用户程序对应的进程页表,判断所述进程页表是否存在第一连续区域,所述第一连续区域位于所述用户空间,且所述第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小;
若所述进程页表不存在所述第一连续区域,判断所述进程页表是否存在第二连续区域,所述第二连续区域位于所述内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小;
所述内核将所述第二连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述第二连续区域对应的起始地址。
2.如权利要求1所述的方法,其特征在于,所述模拟执行所述指令之后,还包括:
所述内核判断模拟执行所述指令得到的模拟结果是否引发其他异常;
若所述模拟结果引发其他异常且其他异常能够被所述内核修正,则所述内核在其他异常处理完成后,根据所述指令模拟处理所述模拟结果;
若所述模拟结果不引发其他异常,则所述内核根据所述指令模拟处理所述模拟结果。
3.如权利要求1所述的方法,其特征在于,所述模拟执行所述指令之前,还包括:
所述内核判断所述访存地址对应的页面是否存在对应的物理地址;若不存在,则建立所述访存地址对应的页面与物理页面的映射关系。
4.如权利要求3所述的方法,其特征在于,所述建立所述访存地址对应的页面与物理页面的映射关系,包括:
若所述访存地址所对应的页面为新分配的,则在物理内存中寻找一个空闲的物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系;
若所述访存地址所对应的页面已被换出到外存,则在物理内存中寻找一个空闲的物理页面,将所述访存地址所对应的页面从外存中读出并写入到所述物理页面,建立所述访存地址对应的页面与所述物理页面的映射关系。
5.如权利要求1至4任一项所述的方法,其特征在于,所述模拟执行所述指令,包括:
若所述指令需要从内核空间读取数据,则所述内核根据所述访存地址和对应的页表项,确定待读取的物理地址;根据所述待读取的物理地址,读取数据;
若所述指令无需从内核空间读取数据,则所述内核从所述指令指定的寄存器和/或用户空间读取数据;
对读取后的数据执行所述指令。
6.如权利要求5所述的方法,其特征在于,内核根据所述指令模拟处理模拟结果,包括:
若所述模拟结果需写入内核空间,则根据所述访存地址和对应的页表项,确定待写入的物理地址;将所述模拟结果写入所述待写入的物理地址对应的物理内存中;
若所述模拟结果无需写入内核空间,则将所述模拟结果写入所述指令指定的寄存器或用户空间。
7.如权利要求5所述的方法,其特征在于,根据所述指令模拟处理模拟结果之后,还包括:
返回所述用户程序的第二指令处或跳转指令对应的目的地址继续执行;所述第二指令为所述指令的下一条指令。
8.一种页面异常处理装置,其特征在于,包括接收单元和处理单元;
所述接收单元,用于接收用户程序触发的页面异常;
所述处理单元,用于确定所述页面异常对应的访存地址对应的页面已分配且所述用户程序满足页面权限;确定所述页面异常对应的访存地址不位于用户空间;确定所述页面异常对应的访存地址位于内核空间;确定所述用户程序中触发所述页面异常的第一指令;获取所述用户程序中所述第一指令后的N条指令;N为大于等于0的整数;模拟执行所述第一指令及所述N条指令;
所述接收单元,还用于获取所述用户程序触发的内存分配请求;
所述处理单元,还用于确定可用内存总量大于所述内存分配请求指示的内存大小;所述可用内存为物理内存和/或交换内存;内核查询所述用户程序对应的进程页表,判断所述进程页表是否存在第一连续区域,所述第一连续区域位于所述用户空间,且所述第一连续区域形成的内存大小大于所述内存分配请求指示的内存大小;若所述进程页表不存在所述第一连续区域,判断所述进程页表是否存在第二连续区域,所述第二连续区域位于所述内核空间,且所述第二连续区域形成的内存大小大于所述内存分配请求指示的内存大小;所述内核将所述第二连续区域对应的页面的状态设置为已分配,且向所述用户程序返回所述第二连续区域对应的起始地址。
CN202410059259.7A 2024-01-16 2024-01-16 一种页面异常处理方法及装置 Active CN117573419B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410059259.7A CN117573419B (zh) 2024-01-16 2024-01-16 一种页面异常处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410059259.7A CN117573419B (zh) 2024-01-16 2024-01-16 一种页面异常处理方法及装置

Publications (2)

Publication Number Publication Date
CN117573419A CN117573419A (zh) 2024-02-20
CN117573419B true CN117573419B (zh) 2024-04-26

Family

ID=89892184

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410059259.7A Active CN117573419B (zh) 2024-01-16 2024-01-16 一种页面异常处理方法及装置

Country Status (1)

Country Link
CN (1) CN117573419B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118093202B (zh) * 2024-04-23 2024-08-23 上海芯联芯智能科技有限公司 一种访存异常的处理方法、计算设备、存储介质及程序产品

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4926322A (en) * 1987-08-03 1990-05-15 Compag Computer Corporation Software emulation of bank-switched memory using a virtual DOS monitor and paged memory management
CN104123233A (zh) * 2013-04-26 2014-10-29 华茂云天科技(北京)有限公司 一种虚拟机大容量内存共享方法
WO2020234155A1 (en) * 2019-05-19 2020-11-26 International Business Machines Corporation Executing system calls in isolated address space in operating system kernel
CN113467981A (zh) * 2020-03-31 2021-10-01 华为技术有限公司 异常处理的方法和装置
WO2021217529A1 (zh) * 2020-04-29 2021-11-04 华为技术有限公司 一种进程间通信的方法及系统
WO2022124720A1 (ko) * 2020-12-09 2022-06-16 연세대학교 산학협력단 운영체제 커널 메모리의 실시간 오류 검출 방법
CN115599510A (zh) * 2021-07-08 2023-01-13 华为技术有限公司(Cn) 一种缺页异常的处理方法及相应装置
CN115687185A (zh) * 2022-10-26 2023-02-03 青岛民航凯亚系统集成有限公司 基于mmap内存映射的手持端低功耗数据采集方法
CN116225765A (zh) * 2023-03-06 2023-06-06 支付宝(杭州)信息技术有限公司 一种在虚拟机中执行指令的方法和一种虚拟机监视器
WO2023098536A1 (zh) * 2021-11-30 2023-06-08 华为技术有限公司 一种运行进程的方法及装置
WO2023165400A1 (zh) * 2022-03-04 2023-09-07 阿里巴巴(中国)有限公司 计算系统、内存缺页处理方法及存储介质

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9069586B2 (en) * 2011-10-13 2015-06-30 Mcafee, Inc. System and method for kernel rootkit protection in a hypervisor environment
WO2014100279A1 (en) * 2012-12-18 2014-06-26 Dynavisor, Inc. Dynamic device virtualization
US9696933B2 (en) * 2014-08-15 2017-07-04 International Business Machines Corporation Virtual machine manager initiated page-in of kernel pages
US9690495B2 (en) * 2015-11-03 2017-06-27 International Business Machines Corporation Emulating memory mapped I/O for coherent accelerators in error state
US10489308B2 (en) * 2017-06-29 2019-11-26 Intel Corporation Mitigating attacks on kernel address space layout randomization
US10423478B2 (en) * 2017-08-29 2019-09-24 Red Hat, Inc. Security enhanced out of process user space handling of hardware events
US11341058B2 (en) * 2018-07-26 2022-05-24 Vmware Inc. Handling software page faults using data from hierarchical data structures

Patent Citations (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4926322A (en) * 1987-08-03 1990-05-15 Compag Computer Corporation Software emulation of bank-switched memory using a virtual DOS monitor and paged memory management
CN104123233A (zh) * 2013-04-26 2014-10-29 华茂云天科技(北京)有限公司 一种虚拟机大容量内存共享方法
WO2020234155A1 (en) * 2019-05-19 2020-11-26 International Business Machines Corporation Executing system calls in isolated address space in operating system kernel
CN113711182A (zh) * 2019-05-19 2021-11-26 国际商业机器公司 在操作系统内核的隔离地址空间中执行系统调用
CN113467981A (zh) * 2020-03-31 2021-10-01 华为技术有限公司 异常处理的方法和装置
WO2021217529A1 (zh) * 2020-04-29 2021-11-04 华为技术有限公司 一种进程间通信的方法及系统
WO2022124720A1 (ko) * 2020-12-09 2022-06-16 연세대학교 산학협력단 운영체제 커널 메모리의 실시간 오류 검출 방법
CN115599510A (zh) * 2021-07-08 2023-01-13 华为技术有限公司(Cn) 一种缺页异常的处理方法及相应装置
WO2023098536A1 (zh) * 2021-11-30 2023-06-08 华为技术有限公司 一种运行进程的方法及装置
WO2023165400A1 (zh) * 2022-03-04 2023-09-07 阿里巴巴(中国)有限公司 计算系统、内存缺页处理方法及存储介质
CN115687185A (zh) * 2022-10-26 2023-02-03 青岛民航凯亚系统集成有限公司 基于mmap内存映射的手持端低功耗数据采集方法
CN116225765A (zh) * 2023-03-06 2023-06-06 支付宝(杭州)信息技术有限公司 一种在虚拟机中执行指令的方法和一种虚拟机监视器

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
面向数据中心计算的操作系统架构与关键技术综述;郑晨;陆钢;谭崇康;詹剑锋;张立新;;高技术通讯;20170815(08);全文 *

Also Published As

Publication number Publication date
CN117573419A (zh) 2024-02-20

Similar Documents

Publication Publication Date Title
US7020738B2 (en) Method for resolving address space conflicts between a virtual machine monitor and a guest operating system
US7661035B2 (en) Method and system for instruction tracing with enhanced interrupt avoidance
US8453015B2 (en) Memory allocation for crash dump
US6772419B1 (en) Multi OS configuration system having an interrupt process program executes independently of operation of the multi OS
US8015388B1 (en) Bypassing guest page table walk for shadow page table entries not present in guest page table
US8799879B2 (en) Method and apparatus for protecting translated code in a virtual machine
US20040117539A1 (en) Methods and systems to control virtual machines
US8347061B2 (en) Method for protecting user-managed memory using an exception
CN117573419B (zh) 一种页面异常处理方法及装置
US20140108761A1 (en) Memory allocation with identification of requesting loadable kernel module
US8156385B2 (en) Systems and methods for backward-compatible constant-time exception-protection memory
EP2955634B1 (en) Paravirtualization-based interface for memory management in virtual machines
US20120117355A1 (en) Memory Management for a Dynamic Binary Translator
CN115017058B (zh) 一种内核模块的测试方法、装置、电子设备及存储介质
CN114327777A (zh) 确定全局页目录的方法、装置、电子设备及存储介质
US8438340B2 (en) Executing atomic store disjoint instructions
US7546600B2 (en) Method of assigning virtual process identifier to process within process domain
US8180980B2 (en) Device emulation support within a host data processing apparatus
US20140222410A1 (en) Hybrid emulation and kernel function processing systems and methods
CN115061781A (zh) 页表处理方法和装置
CN118093202B (zh) 一种访存异常的处理方法、计算设备、存储介质及程序产品
CN118069403B (zh) 一种异常指令的处理方法
US20080072009A1 (en) Apparatus and method for handling interrupt disabled section and page pinning apparatus and method
CN115421875B (zh) 二进制翻译方法及装置
US11755243B2 (en) Apparatus and method for triggering action

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant