第4章 80X86保护模式及其编程(1)

本文详细解读了80X86保护模式下的系统寄存器、内存寻址、地址变换、分段机制(包括段选择符、描述符和特权级)、分页机制(页表结构和保护)、以及段级和页级保护的实现原理。涉及的标签包括处理器架构、内存管理、保护模式编程和系统指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第4章 80X86保护模式及其编程


intel architecture software developer’s manual
主要介绍80x86 CPU体系结构以及保护模式下编程。主要包括80x86基础知识、保护模式内存管理、各种保护措施、中断和异常处理、任务管理、保护模式编程的初始化以及一个简单的多任务内核的例子。

4.1 80X86系统寄存器和系统指令

在这里插入图片描述

4.1.1 标志寄存器

标志寄存器EFLAGS:
在这里插入图片描述
各个系统标志介绍:
TF:跟踪标志(Trap Flag),位8。置位时可为调试操作启动单步执行方式;复位时则禁止单步执行。单步执行状态下,处理器在每个指令执行之后产生一个调试异常,以便于观察执行程序在执行每条指令后的状态。程序通过POPF,POPFD或IRET指令设置TF标志位。

IOPL:I/O特权级。(I/O Privilege Level)位13-12。指明当前运行程序或任务的I/O特权级。当前运行程序或任务的特权级CPL(Current Privilege Level)小于等于IOPL时,才可以访问I/O地址空间。只有当IOPL值为0时,程序才可以使用POPF或IRET指令修改这个字段。IOPL是控制对IF标志修改的机制之一。(参考x86 - 特权级别 CPL / RPL / DPL / IOPL

NT:嵌套任务标志(Nested Task),位14。控制着被中断任务和调用任务之间的链接关系。在使用CALL指令、中断或异常执行任务调用时,处理器会设置该标志。在通过使用IRET指令从一个任务返回时,处理器会检查并修改这个NT标志。使用POPF/POPFD指令也可以修改这个标志。但是在应用程序中修改这个标志会产生不可意料的异常。

RF:恢复标志(Resume Flag)。用于控制处理器对断点指令的响应。

VM:虚拟-8086方式标志(Virtual-8086 Mode)。设置时,开启虚拟-8086方式;复位时,回到保护模式。

4.1.2 内存管理寄存器

四个:GDTR、LDTR、IDTR、TR,均为段基址寄存器,段中含有分段机制的重要信息表。GDTR、IDTR和LDTR用于寻址存放描述符表的段。TR用于寻址一个特殊的任务状态段TSS(Task State Degement)
在这里插入图片描述1.全局描述符表寄存器GDTR(Global Descriptor Table Register)
GDTR寄存器中用于存放全局描述符表GDT的32位线性基地址和16位表长度值。共48位。
2.中断描述符表寄存器IDTR(Interrupt Descriptor Table Register)
IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值,共48位。
3.局部描述符表寄存器LDTR(Local Descriptor Table Register)
LDTR寄存器中用于存放局部描述符表LDT的32位线性基地址、16位段限长和描述符属性值。
4. 任务寄存器TR(Task Register)
TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。

4.1.3 控制寄存器

在这里插入图片描述
包括CR0,CR1,CR2,CR3。CR3也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)
在这里插入图片描述
1.CR0中协处理器控制位
包括ET、TS、EM和MP

ET:扩展类型(Extension Type) ,位4。当该位为1时,系统有80387协处理器存在,并使用32位协处理协议;当该位为0时,指明使用80287协处理器。如果EM位为1,则该位被忽略。

TS:任务已切换(Task Switched),位3,用于推迟保存任务切换时的协处理器内容,直到新任务开始实际执行协处理器指令。

EM:仿真(EMulation),位2。当该位设置时,说明处理器没有内部或外部协处理器;当清除时,表明系统由协处理器。

MP:监控协处理器(Monitor Coprocessor或Math Present),位1。用于控制WAIT/FWAIT指令与TS标志的交互作用。
在这里插入图片描述

2.CR0中的保护位
PE:启动保护(Protection Enable),位0。
PG:分页(Paging),位31。
WP:写保护(Write Protect),位16
NE:协处理器错误(Numeric Error),位5。

PE=0,PG=0 实地址模式
PE=1,PE=0 没有开启分页机制的保护模式下
PE=0,PG=0 无效组合
PE=1,PG=1 开启了分页机制的保护模式下

3.CR2和CR3
CR2和CR3用于分页机制。
CR3:含有存放页目录表页面的物理地址,因此称为PDBR。
TLB:(Translation Lookside Buffer)
CR2:出现页异常时报告出错信息。

4.1.4 系统指令

系统指令:用于处理系统级功能,如加载系统寄存器、管理中断等。大多数只能由处于特权级0的操作系统软件执行,少部分指令任何特权级都可以用。
在这里插入图片描述
在这里插入图片描述

4.2 保护模式内存管理

4.2.1 内存寻址

80x86是小端存储(Little Endium)
段(segment)寻址:段地址+段内偏移。段地址使用16位段选择符,其中14位用于选择,可选择2^14共16384个段;段内偏移地址用32位值来确定,段内地址0到4G。16位段+32位段内偏移共48位地址称为逻辑地址(虚拟地址)。
6个段寄存器:CS:寻址代码段,EIP寄存器中是当前代码段中下一条要执行的指令的段内偏移地址,因此要执行的指令的地址为:CS:[EIP];
DS:当指令中没有指定操作数据段时,DS是默认的数据段寄存器;
ES、
SS:寻址栈段,栈顶地址由ESP寄存器内容指定,栈顶地址为SS:[ESP];
FS和GS
在这里插入图片描述

4.2.2 地址变换

在这里插入图片描述
地址转换:将48位逻辑地址映射到实际的物理地址,以内存块为操作单位。有分段和分页两种转换方式,其转换由操作系统访问驻留在内存中的表示来指定。
在这里插入图片描述
上面这张图很好的说明了逻辑地址、线性地址和物理地址的关系。
具体的映射关系如下:

1.分段机制
在这里插入图片描述在内存的段描述符表中是保存着段描述符。段描述符指明段的大小,访问权限和段的特权级、段类型以及段的第一个字节在线性地址空间中的位置(段的基地址)。
段选择符共14位可用,因此逻辑地址共46位可用,即最多寻址64TB。
如果禁用分页机制,则线性地址空间就是物理地址空间。
在这里插入图片描述
这张图全面的解释了整个的地址转化过程,包括目录的指针保存地址和整个的系统转化过程。

2.分页机制
虚拟存技术:大容量的线性地址需要使用小块的物理内存(RAM或ROM)以及某些外部存储空间(例如大容量硬盘)来模拟。操作系统通过维护页表实现线性地址和物理地址的转换。
当访问的页面不在物理内存中时,处理器就会中断程序执行,产生页错误异常。然后操作系统将缺少的页读入内存,再继续。

4.2.3 保护

两类保护
1.通过给每个任务不同的虚拟地址(逻辑地址)空间来完全隔离各个任务;
2.对任务进行操作,保护操作系统内存段和处理器特殊系统寄存器不被应用程序访问。

1.任务之间的保护
把每个任务放置在不同的虚拟地址空间中,并给予每个任务不同的逻辑地址到物理地址的变换映射。每个任务都有自己的段表和页表,当处理器切换去执行一个新任务时,任务切换的关键部分就是切换到新任务的变换表。
全局地址空间(Global address space)
在这里插入图片描述
局部地址空间(Local address space),每个任务唯一的虚拟地址空间部分。
在这里插入图片描述
虚拟地址技术:实现不同任务之间的内存隔绝与共享。

2.特权级保护
在一个任务中,有4个特权级(Privilege Levels)。0表示最高特权级,3表示最低特权级。当前特权级(Current Privilege Level)是当前活动代码段的特权级,可以访问同级或低一级的数据,但是对高级别段的引用是非法的,并且会引发异常。每个特权级都有自己的栈。

4.3 分段机制

分段机制可以实现平坦模型和多段模型。

4.3.1 段的定义

虚拟地址空间由段部分和偏移部分组成
每个段由三个参数定义:
在这里插入图片描述
段基地址(Base address)
段限长(limit)
段属性(Attributes)
多个段映射到线性地址中的范围可以部分重叠或覆盖,甚至完全重叠。
在这里插入图片描述
段的三个参数存储在段描述符(Segment Descriptor)结构项中。段描述符保存在内存中的段描述符表(Descriptor Table)中。虚拟地址中段选择符用于制定段描述符表中的某个位置的段描述符,从而制定响应的段。
段描述符表的起始地址应该是保存在三个段描述符表寄存器GDTR、IDTR和LDTR中。

线性地址空间中含有为系统定义的所有段和系统表。由逻辑地址到线性地址的转换过程为:
在这里插入图片描述
在这里插入图片描述
如果没有开启分页,则线性地址即为物理地址,被送到处理器地址总线上;
如果开启了分页,则还有线性地址到物理地址的转换过程。

4.3.2 段描述符表

在这里插入图片描述
在这里插入图片描述
描述符表存储在由操作系统维护着的特殊数据结构中,并且由处理器的内存管理硬件来引用。

GDT本身不是一个段,而是线性地址空间中的一个数据结构;LDT表存放在LDT类型的系统段中,是一个段,此时在GDT中必须含有LDT的段描述符。

当发生任务切换时,LDT会更换成新任务的LDT,但是GDT并不会改变,即GDT所映射的虚拟地址空间是系统中所有任务共有的。
图4.9 是一个任务中的段如何能在GDT和LDT之间分开。
在这里插入图片描述
每个系统必须定义一个GDT,并可用于系统中所有的程序或任务。另外,可选定义一个或多个LDT。例如,可以为每个运行任务定义一个LDT,或者某些或所有任务共享一个LDT。
LDTR应该是一个16位的寄存器,其需要先在GDT中找到段描述符,然后再进行寻址。参考两张图看懂GDT、GDTR、LDT、LDTR的关系
这边还是有点乱。后面看到代码再深入理解。

4.3.3 段选择符

段选择符(或称段选择子)是段的一个16位标识符。
在这里插入图片描述
三个字段内容:
请求特权级RPL(Requsted Privilege Level) 2位
表指示标志TI(Table Index) 1位
索引值(Index) 13位

对表指示标志TI:0表示描述符在GDT中;1表示描述符在LDT中。
索引字段:在GDT和LDT中的索引项号。
在这里插入图片描述
选择符的值通常是由连接编辑器或链接加载程序进行设置或修改,而非应用程序。
在这里插入图片描述
对于访问某个段的程序,必须已经把段选择符加载到一个段寄存器。
隐藏部分(描述符缓冲或影子寄存器)保存段基地址、限长和属性信息。
加载寄存器指令:
在这里插入图片描述

4.3.4 段描述符

段描述符:GDT和LDT表中的一个数据结构项,用于向处理器提供有关一个段的位置和大小信息以及访问控制的状态信息。长度8字节,包括段基地址、段限长和段属性。
段描述符通常由编译器、连接器、加载器或者操作系统来创造。其一般格式为:
在这里插入图片描述
各字段和标志的含义为:

  • 段限长字段LIMIT(Segment limit fileld):指定段的长度,共20位。单位:当颗粒度标志G=0时,为字节,此时范围为0-1M;当颗粒度标志G=1时,为4kb(页),此时范围为4kb到4GB。
  • 基地址字段BASE(base address field):定义在4GB线性地址空间中一个段字节0所处的位置,共32位。
  • 段类型字段TYPE(Type field):指定段或门(gate)的类型,说明段的访问种类以及段的扩展方向。第2个双字第8-11位。见图4-14
  • 描述符类型标志S(Descriptor type flag):S=0,系统段描述符;S=1,代码或数据段描述符。第2个双字第12位
  • 描述符特权级字段DPL(Descriptor privilege level):指明描述符的特权级,从0到3,0最高,3最低。第2个双字第13-14位
  • 段存在标志P(Segment present):指出一个段是在内存中(1)还是不在内存中(P=0)。第2个双字第15位。见图4-15
  • D/B(默认操作大小/默认栈指针大小和/或上界限)标志(Default operation size/default stack pointer size and/or upper bound),第2个双字第22位
  • 颗粒度标志G(Granularity):该字段用于确定段限长字段Limit的单位。第2个双字第23位。G=1,段限长单位为4kb;G=0,段限长单位为1字节。
  • 可用和保留比特位(Available and reserved bits):段描述符第2个双字的位20可供系统软件使用;为21是保留为并应该总是设置为0。
    在这里插入图片描述
    在这里插入图片描述

4.3.5 代码和数据段描述符类型

当描述符类型标志S=1时,该描述符用于代码段(第11位为1)或者是数据段(第11位为0),具体为:
在这里插入图片描述

4.3.6 系统描述符类型

当描述符类型标志S=0时,该描述符为一个系统描述符。处理器可以识别的系统段描述符有:
在这里插入图片描述
可以分为系统段描述符(前两个)以及门描述符(后4个)。
在这里插入图片描述
在这里插入图片描述

4.4 分页机制

分页机制在分段机制的基础上完成虚拟(逻辑)地址到物理地址的转换过程。通过设置控制寄存器CR0的PG位来启用分页机制。当PG=1,启用分页。
线性地址空间中的任务页面都可以被映射到物理地址空间的任何页面上。
在这里插入图片描述
80x86使用4K字节固定大的页面。
分页就是将32位线性地址转换到32位物理地址,由于4k为一个页面,因此低12位可以直接作为页内偏移。因此分页机制的重定位功能可以看做是把线性地址的高20位转换到对应物理地址的高20位。

在这里插入图片描述

4.4.1 页表结构

分页转化功能由页表(page table)实现,此表保存在物理地址空间中。页表可以看做是简单的2^20物理地址数组。
在这里插入图片描述

4.4.1.1 两级页表结构

1级页表:2^20个,每个4字节,共4MB
2级页表:第一级为页目录(page directory),1k个4字节长度的表项,共4k,一个页面;第二级为页表(page table),最多含有1k个4字节的表项,也是4kb,1个页面。
在这里插入图片描述
第二级页表仅在需要时建立即可,因此两级页表可以节省空间。
页目录的基地址保存在CR3寄存器中。

4.4.1.2 不存在的页表

为什么分表会减少内存占用:
在这里插入图片描述

4.4.2 页表项格式

页目录和页表的表项格式。高20位为物理地址,低12位为标志位。
这样正好,因为页目录和一个页帧都是4kb。
在这里插入图片描述
各个标志位的含义:

  • P–位0,存在(Present)标志,指明页表项对地址转换是否有效,为1时有效,为0时无效。
  • R/W–位1,读/写(Read/Write)标志。为1,表示可读、写或执行;为0,表示只读或执行。当处理器运行在超级用户特权级(级别0、1、2)时,此位不起作用。页目录项中的R/W位对其映射的所有页面起作用。
  • U/S–位2,用户/超级用户(User/Supervisor)标志。为1,则任何特权级上的程序都可以访问该页面;为0,则只能被运行在超级用户特权级(0,1,2)上的程序访问。页目录项中的U/S位对其映射的所有页面起作用。
  • A–位5,已访问(Access)标志。
  • D–为6,页面已被修改(Dirty)标志。
  • AVL–该字段保留专供程序使用。

4.4.3 虚拟存储

在这里插入图片描述

4.5 保护

保护机制是可靠的多任务运行环境所必须的,它可以用于保护各个任务免受相互之间的干扰。

设置控制寄存器的CR0的PE标志(位0),开启分段保护机制。
设置控制寄存器的CR1的PG标志(位31),开启分页保护机制。

在这里插入图片描述
请求特权级RPL(Requsted Privilege Level) 在段选择符中;
当前特权级(Current Privilege Level)是当前活动代码段的特权级。

4.5.1 段级保护

段保护需要进行的检查包括:
在这里插入图片描述
违反的操作将导致异常。

4.5.1.1 段限长Limit检查

在这里插入图片描述
前面4.3.4节和4.3.5节,标志位的具体描述还是要看书。

4.5.1.2 段类型TYPE检查

在这里插入图片描述
关于S和TYPE字段见4.3.4节,段描述符。
在这里插入图片描述
在段选择符被加载进段寄存器的时候,相关的段描述符也已经加载到影子寄存器中了,见4.3.3节段选择符。

4.5.1.3 特权级

在这里插入图片描述
特权级这个东西应该是处理处理器本身实现的,也就是硬件上实现的,而不是通过软件实现的。

为了在各个代码段和数据段之间进行特权级检测处理,处理器可以识别三种类型的特权级:

  • 当前特权级CPL(Current Privilege Level0:当前正在执行程序或任务的特权级,它存放在CS和SS段寄存器的位0和位1中。
  • 描述符特权级DPL(Descriptor Privilege Level)。DPL是一个段或门的特权级。它存放在段或门描述符的DPL字段中。对不同的段或门的类型,DPL有不同的含义:
    在这里插入图片描述
  • 请求特权级RPL(Request Privilege Level)。RPL是一种赋予段选择符的超越特权级。它存放在选择符的位0和位1中。
    (这边还是说不太清楚,在后面学到代码的时候再仔细看看)
    在这里插入图片描述

4.5.2 访问数据段时的特权级检查

在这里插入图片描述
CPL是当前运行程序的优先级,RPL是如何确定的呢?
在这里插入图片描述
访问代码段中的数据:
在这里插入图片描述关于一致性代码段和非一致性代码段的可以参考【从头开始写操作系统系列】一致代码段与非一致代码段
总结来讲:

一致性代码段:通俗的讲,一致代码段就是系统用来共享、提供给低特权级的程序使用调用的代码。特点:特权级高的程序不允许访问特权级低的数据,即核心态程序不能访问用户态数据;特权级低的程序可以访问特权级高的程序,但是特权级不会因此而改变;

非一致代码段:为了避免被低特权级程序访问而被系统保护起来的代码。特点:只允许同级之间访问;不允许不同级之间访问,核心态不能访问用户态,用户态也不能访问核心态。

4.5.3 代码段之间转移控制时的特权级检查

在这里插入图片描述

4.5.3.1 直接调用或跳转到代码段

在这里插入图片描述
近转移:不会执行特权级检查;
远转移:会执行特权级检查;

当不通过调用门把程序控制权转移到另一个代码段时,处理器会验证4种特权级和类型信息:
在这里插入图片描述
在这里插入图片描述
这个目的代码段的段选择符中的描述符特权级是由谁指定的?

在这里插入图片描述

4.5.3.2 门描述符

在这里插入图片描述
任务门用于任务切换;
陷阱门和中断门是调用门的特殊形式类,专门用于调用异常和中断的处理程序;
调用门:用于在不同特权级之间实现受控的程序控制转移。
在这里插入图片描述
调用门也放在GDT或者LDT中,也是8个字节,但是格式与段描述符不同。

  • 段选择符:指定要访问的代码段;
  • 偏移值字段:指定段中入口点,通常是指定过程的第一条指令;
  • DPL字段:调用门的特权级,即指定通过调用门访问特定过程所要求的特权级;
  • P:调用门描述符是否有效。
  • 参数个数(Param Count):指明在发生堆栈切换时从调用者堆栈复制到新堆栈中的参数个数。

在linux中没有用到调用门。这些功能都是处理器提供的。

4.5.3.3 通过调用门访问代码段

在这里插入图片描述
远指针 包括 16位段选择符+32位偏移地址
在这里插入图片描述
相对于直接调用,只是加了调用门这一步。直接调用:地址指针->段描述符;调用门:地址指针->调用门->段描述符。
调用门本身带有偏移地址,也就是调用门是对特定段的特定部分程序的调用。

在这里插入图片描述
在这里插入图片描述
使用CALL指令和JMP指令的特权级检测规则如表4.5。为了访问调用门,调用者程序的特权级CPL以及调用门选择符的特权级RPL均需高于或等于调用门的DPL(数值上小于)。
在这里插入图片描述
CALL可以通过调用门把程序转移到特权级更高的非一致性代码段中;JMP只能转移到特权级一样的非一致性代码段;
JMP和CALL都可以把控制转移到更高特权级的一致性代码中。
关于调用时堆栈是否切换以及调用门的两种使用方法:
在这里插入图片描述

4.5.3.4 堆栈切换

在这里插入图片描述
每个任务必须定义最多4个栈,分别用于运行特权级0,1,2,3的应用程序代码。对只使用0和3两个特权级的系统,每个任务只需要设置两个栈。
在这里插入图片描述
当使用调用门导致特权级改变时,CPU会执行以下步骤切换堆栈并开始在新的特权级上执行被调用过程:
1.使用目的代码段的DPL(即新的CPL)从TSS段中选择新栈的指针;
2.检查栈段描述符特权级和类型是否有效;
3.临时保存SS和ESP寄存器的当前值,把新栈的段选择符和栈指针加载到SS和ESP中,然后把临时保存的SS和ESP内容压入新栈中。
4.把调用门描述符中指定参数个数的参数从调用过程栈复制到新栈中。调用门中参数个数值最大为31,如果个数为0,则表示无参数,不需复制。
5.把返回指令指针(即当前CS和EIP内容)压入新栈。把新(目的)代码段选择符加载到CS中,同时把调用门中偏移值(新指令指针)加载到EIP中,最后开始执行被调用过程。
在这里插入图片描述

4.5.3.5 从被调用过程返回

在这里插入图片描述
1.检查保存的CS寄存器中RPL字段值,以确定在返回时特权级是否需要改变。
2.弹出并使用被调用过程堆栈上的值加载CS和EIP寄存器。
3.如何RET指令包含一个参数个数操作数并且返回操作会改变特权级,那么就在弹出栈中CS和EIP值之后,把参数个数值加到ESP寄存器值中,以跳过(丢弃)被调用者栈上的参数。此时ESP寄存器指向原来保存的调用者堆栈的指针SS和ESP。
4.把保存的SS和ESP值加载到SS和ESP寄存器,从而切换回调用者的堆栈。
5.如果RET指令包含一个参数个数操作数,则把参数个数值加到ESP寄存器值中,以跳过(丢弃)调用者栈上的参数。
6.检查段寄存器DS、ES、FS和GS的内容。如果其中有指向DPL小于新的CPL的段(一致代码段除外),那么CPU就会用NULL选择符加载这个段寄存器。
其实就是逐弹出图4-25中的内容,并恢复到原始栈,但是最后一条没有理解。
目前还都是理论,希望到代码的时候可以更加深入的理解。

4.5.4 页级保护

在这里插入图片描述
在这里插入图片描述
页级保护是在分段机制提供的保护措施之后发挥作用。即先进行段级保护和测试;然后再进行页级保护检查。二者串行进行,例如,仅当段保护和页保护都允许写时,才可以对页面进行写操作。

页面的保护属性由页目录和页表中表项的“串行”或“与操作”构成。

在这里插入图片描述
页目录和页表项的保护是串行的,即如果页目录保护不允许写,则此目录下所有的页面不允许写;如果页目录保护允许写,但是页表项不允许写,则对此页面不允许写。

4.5.4.1 修改页表项的软件问题

为了寻址速度,避免每次内存应用都要访问驻留内存的页表,最近使用的线性地址到物理地址的转换信息被保存在处理器内的页高速缓冲中,即转换查找缓冲TLB(Translation Lookaside Buffer)。

在由虚拟地址到线性地址的过程是怎么做的呢?猜测是根据段寄存器中的影子寄存器保存基地址信息+虚拟地址给出的偏移地址,从而得到线性地址。这样看来段寄存器中的影子寄存器相当于段寻址时候的TLB,没有他们,每次段寻址还得去查GDT或者LDT来找到段基址,然后计算线性地址。

在这里插入图片描述
有TLB就会产生一致性的问题,即当页表被修改时,如何保证TLB中的数据和页表中的数据的一致性?这个由操作系统来保证,通过重新加载页目录表基地址到CR3中。
TLB的结构可以猜测,就是一个32位的线性地址值,然后一个32位物理地址值,类似于

编号线性地址物理地址
10x000010000x00002000
20xfc3420000x0345d000

具体的TLB的结构为可以参考Translation Lookaside Buffer (TLB) in Paging。TLB的作用是使得访存速度更快了。如过没有TLB,则每次从线性地址到物理地址都需要两次访问内存,一次用于查找页表,找到对应的实际物理地址,然后从物理地址访存得到想要的指令或数据;而加入TLB之后,如果命中,则只需要访问一次TLB与一次内存即可。TLB的访问速度要远远大于内存。
具体使用TLB的性能提升与命中率以及访问TLB的速度与访问内存的速度差有关,也即上面的文章中提到的公式:
在这里插入图片描述
E M A T = h ∗ ( c + m ) + ( 1 − h ) ∗ ( c + 2 m ) EMAT = h*(c+m)+(1-h)*(c+2m) EMAT=h(c+m)+(1h)(c+2m)
(markdown 公式编辑参考:Cmd Markdown 公式指导手册

4.5.5 组合页级和段级保护

在这里插入图片描述
如前所述,段级保护和页级保护是一个串行的过程。从段到页是一个逐渐细化保护范围的过程,最小的保护范围是一页,这应该也是内存组织的最小单位了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值