tags:
- 操作系统
categories: - 操作系统
link: https://www.notion.so/018-1f01519872f04a2f8aa6e084c88c62a2
notionID: 1f015198-72f0-4a2f-8aa6-e084c88c62a2
title: OS-018-李煦-Part 1
[[…/…/操作系统课程总括|操作系统课程总括]]
[[CourseNotes/操作系统/OS-X86系统架构概览]]
1.1 系统级体系架构概览
Global and Local Descriptor Tables
#GDT #LDT #CPL
在保护模式下,所有的内存访问都通过全局描述符表(GDT)或者可选的局部描述符表(LDT)进行。这些表包括了被称作段描述符的条目。段描述符
提供了段的基地址以及访问权限、类型和使用信息。每个段描述符
都有一个相关联的段选择子
。段选择子
为使用它的软件提供了一个索引,指向GDT或者LDT(关联段描述符的偏移),还有访问权限的信息。要访问一个段中的字节,必须提供一个段选择子和一个偏移量。
段选择子
提供了访问该段的段描述符
(在GDT或者LDT中)。处理器通过段描述符获取线性地址空间中段的基地址。而偏移量提供了相对于基地址的字节位置。只要该段在当前特权级(CPL)下可访问,该机制可以用来访问任何有效的代码、数据或者堆栈段。CPL
被定义为当前执行代码段的保护级别。
IA32子模式中的情况
GDTR
和LDTR
寄存器在IA-32e子模式(64位模式和兼容模式)中扩展为64位宽。全局和本地描述符表在64位模式下扩展以支持64位的基地址(16字节的LDT描述符包含64位的基地址和各种属性)。在兼容模式中,描述符不会被扩展。
System Segments, Segment Descriptors, and Gates
程序或过程的执行环境由代码
、数据
和堆栈段
组成。除此之外,体系结构还定义了任务状态段(TSS
)和LDT
两个系统段。Gate(调用门、中断门、陷阱门和任务门)是一组特殊的描述符,为系统过程和处理程序提供了受保护的通道,可以在不同的特权级别上操作。
调用门可以提供访问特权级别较低的代码段中的过程的途径。调用过程需要提供调用门的选择子,并进行访问权限检查。如果允许访问目标代码段,则处理器获取目标代码段的段选择子和偏移量,并可能切换到不同特权级别的堆栈。门还可进行16位和32位代码段之间的转换。
Task-State Segments and Task Gates
TSS
(任务状态段)定义了任务的执行环境状态。
它包括通用寄存器
、段寄存器
、EFLAGS寄存器
、EIP寄存器
等的状态,以及与任务关联的LDT的段选择器和分页结构的基地址。
在切换任务时,处理器会执行一系列操作,包括保存当前任务的状态,加载新任务的段选择器到任务寄存器,使用GDT中的段描述符访问新的TSS,将新任务的状态加载到相应的寄存器中,并开始执行新任务。此外,任务也可以通过任务门进行访问,任务门类似于调用门,提供对TSS的访问。
Interrupt and Exception Handling
中断描述符表(IDT
)用于处理外部中断
、软件中断
和异常
。
IDT存储了一组门描述符,这些描述符提供对中断和异常处理程序的访问。与GDT类似,IDT不是一个段。IDT的基地址线性地址包含在IDT寄存器(IDTR) 中。IDT中的门描述符
可以是中断门
、陷阱门
或任务门
描述符。
要访问中断或异常处理程序,处理器首先从内部硬件、外部中断控制器或软件通过INT、INTO、INT 3或BOUND指令接收中断向量(中断号)。中断向量提供了对IDT的索引
。如果选定的门描述符是中断门或陷阱门
,则通过类似于调用通过调用门的过程的方式访问关联的处理程序。如果描述符是任务门
,则通过任务切换访问处理程序
。
根据描述器表,处理器访问中断和异常处理程序的流程图如下所示:
Memory Management
系统架构可以支持物理寻址或虚拟内存寻址。当使用物理寻址时,线性地址被视为物理地址。 当使用分页时,代码
、数据
、堆栈
和系统段
都可以进行分页,只有最近访问的页面保存在物理内存中。
页面的位置存储在分页结构中,而分页结构本身存储在物理内存中。分页结构的基本物理地址存储在控制寄存器
CR3中。分页结构中的条目确定页面框的物理地址
、访问权限
和内存管理信息
。
为了使用分页机制,线性地址被分为几个部分,这些部分提供对分页结构和页面框的独立偏移量。系统可以有一个或多个分页结构层次,例如,每个任务可以有自己的分页结构层次。
System Registers
在文中得到系统寄存器模块提到了系统架构中用于初始化处理器和控制系统操作的一些系统标志位
和寄存器
。其中,EFLAGS
寄存器中的系统标志位
和IOPL字段
用于控制任务和模式切换、中断处理、指令跟踪和访问权限。
控制寄存器(CR0
、CR2
、CR3
和CR4
)包含了各种用于控制系统级操作的标志位和数据字段。调试寄存器允许设置断点,用于调试程序和系统软件。GDTR、LDTR和IDTR寄存器包含了它们各自表的线性地址和大小。任务寄存器包含当前任务的TSS的线性地址和大小。
还提到了特定型号寄存器(MSRs),这是一组供操作系统或执行体过程使用的寄存器,控制调试扩展、性能监视计数器、机器检查架构和内存类型范围等项目。大多数系统限制应用程序对系统寄存器的访问,但在特权级0上运行的程序可以修改系统寄存器。
1.2 实模式和保护模式的转换
-
保护模式 — 这是处理器的本机操作模式。它提供了丰富的架构功能、灵活性、高性能和向后兼容性,适用于现有软件基础。
-
实地址模式 — 这种操作模式提供了Intel 8086处理器的编程环境,添加了一些扩展功能(如切换到保护模式或系统管理模式的能力)。
其他的操作模式类型:
-
系统控制模式 —(System Management Mode,SMM)是所有IA-32处理器的标准架构特性,从Intel386 SL处理器开始引入。该模式为操作系统或执行体提供了一种透明的机制,用于实现电源管理和OEM差异化功能。SMM通过激活外部系统中断引脚(SMI#)进入,从而生成系统管理中断(SMI)。在SMM中,处理器切换到单独的地址空间,并保存当前运行的程序或任务的上下文。然后,可以透明地执行特定于SMM的代码。从SMM返回后,处理器会恢复到SMI之前的状态。
-
虚拟-8086模式—是一种在保护模式下的特殊模式,允许处理器执行8086软件。这允许在多任务环境中运行使用旧的8086指令集编写的软件。
-
IA-32模式 — 在IA-32模式当中,处理器支持两种子模式:性能模式和 64位模式。64-位模式提供了64位的线性地址并支持物理地址的空间大于 64GB。性能模式允许最多的遗留的保护模式的应用正常的运行。
1.3. 80x86系统指令寄存器
EFLAGS
EFLAGS
里面存放的是虚拟机的标志,决定了处理器是否在保护模式还是在虚拟8086模式下运行。从保护模式到虚拟模式下的传话常常是由任务的切换或者中断和异常来引起的。(前文提及)
EFLAGS
寄存器是x86架构中的一个32位寄存器,用于存储各种处理器状态和控制标志位。
TF
- Trap Flag (位8): 设置为1的时候开启单步调试。
IF
- Interrupt Enable Flag (位9): IF标志控制处理器对可屏蔽硬件中断请求的响应。当IF被设置为1时,处理器响应可屏蔽硬件中断;当IF被清除为0时,可屏蔽硬件中断被禁用。
IOPL
- I/O Privilege Level (位12和位13): IOPL字段表示当前运行的程序或任务的I/O特权级别。只有当当前特权级别(CPL)为0时,POPF和IRET指令才能够修改IOPL字段。IOPL控制了对I/O地址空间的访问权限。
NT
- Nested Task (位14): NT标志用于控制中断和任务的链接。处理器在调用任务(通过CALL指令、中断或异常)时设置此标志。它在由IRET指令启动的任务返回时检查和修改。NT标志可以通过POPF/POPFD指令显式设置或清除,但更改这个标志的状态可能会导致意外的异常。
RF
- Resume Flag (位16): RF标志控制处理器对指令断点条件的响应。当RF被设置为1时,暂时禁用了由指令断点引起的调试异常(#DB)。清除RF时,指令断点会再次生成调试异常。RF标志的主要作用是允许在指令断点引发的调试异常之后重新启动指令。
VM
- Virtual 8086 Mode (位17): VM标志用于控制处理器是否处于虚拟8086模式。当VM被设置为1时,处理器进入虚拟8086模式;清除VM时,处理器返回到保护模式。
AC
- Alignment Check (位18): AC标志与AM标志一起,用于启用内存引用的对齐检查。当引用未对齐的操作数时,会触发对齐检查异常。对齐检查异常仅在用户模式下(特权级别3)生成。
VIF
- Virtual Interrupt Flag (位19): VIF标志包含了IF标志的虚拟映像。处理器只有在控制寄存器CR4中的VME标志或PVI标志被设置,且IOPL小于3时才能识别VIF标志。VME标志启用虚拟8086模式扩展,PVI标志启用保护模式虚拟中断。
内存管理寄存器
该处理器提供四个内存管理寄存器(GDTR
、LDTR
、IDTR
和 TR
),用于指定控制分段内存管理的数据结构的位置。
内存管理寄存器
GDTR
寄存器保存基址 和 GDT 的 16 位表限制。基址指定GDT的字节0的线性地址;表限制指定表中的字节数。LGDT
和 SGDT
指令分别加载和存储 GDTR
寄存器。作为保护模式操作的处理器初始化过程的一部分,必须将新的基址加载到 GDTR 中。
LDTR
寄存器保存16位段选择器,基址,LDT的段限制和描述符属性。基址指定LDT段第0字节的线性地址;段限制指定了段中的字节数。LLDT
和SLDT
指令分别加载和存储LDTR寄存器的段选择器部分。包含LDT的段必须在GDT中有一个段描述符。当LLDT指令在LDTR中加载段选择器时,LDT描述符中的基址、限制和描述符属性会自动加载到LDTR中。当任务切换发生时,LDTR将自动加载用于新任务的LDT的段选择器和描述符。在将新的LDT信息写入寄存器之前,LDTR的内容不会自动保存。
IDTR
寄存器在保护模式下保存基址、64和16位的IDT表限制。基址指定IDT第0字节的线性地址;表限制指定表中的字节数。LIDT
和SIDT
指令分别加载和存储IDTR
寄存器。然后,作为处理器初始化过程的一部分,可以改变寄存器中的基址和限制
TR
寄存器保存16位段选择器,基址,当前任务的TSS的段限制和描述符属性。选择器引用GDT
中的TSS
描述符。基址指定TSS
的第0字节的线性地址;段限制指定TSS
的字节数。LTR
和STR
指令分别加载和存储任务寄存器的段选择器部分。当LTR
指令在任务寄存器中加载段选择器时,来自TSS描述符的基址、限制和描述符属性会自动加载到任务寄存器中。当任务切换发生时,任务寄存器将自动加载新任务的TSS的段选择器和描述符。
控制寄存器
CR0
包含控制操作模式和处理器状态的系统控制标志。
CR1
预留。
CR2
包含页面故障线性地址(导致页面故障的线性地址)。
CR3
包含分页结构层次结构的基础物理地址和两个标志(PCD和PWT)。只指定基址的最高有效位(低于低12位);地址的后12位假定为0。当使用物理地址扩展时,CR3寄存器包含页目录指针表的基址。
其他的控制寄存器
1.4. 系统指令
LGDT
作用是将GDT基址和限制从内存加载到GDTR寄存器中。
SGDT
作用是将GDT基址和限制从GDTR寄存器存储到内存中。
LIDT
作用是将IDT基址和限制从内存加载到IDTR寄存器中
SIDT
作用是将IDT基址和限制从IDTR寄存器存储到内存中。
LLDT
作用是写入LDT寄存器
SLDT
作用是从LDTR寄存器里面向内存或者全局寄存器保存LDT段选择器中的内容
LTR
作用是将TSS的段选择器和段描述符从内存加载到任务寄存器中。段选择操作数也可以位于通用寄存器中。
STR
作用是将当前任务TSS的段选择器从任务寄存器存储到内存或通用寄存器中。