探究计算机中断处理:了解Intel x86处理器下的外部中断、异常和陷入

处理器中断处理是计算机体系架构中必须掌握的知识之一。在 Intel 的 x86 处理器下,中 断可以分为外部中断、异常和陷入。外部中断来自硬件,是随机发生的,而异常则是处理器 内部执行指令过程中检测到错误条件的结果。陷入则是由程序产生的,通常是由 INT n、INTO 等指令触发的。 在 x86 处理器中,中断处理程序负责处理中断,异常处理程序负责处理异常,而系统调用 服务程序则负责处理陷入。这些处理程序可以位于内存空间的任何位置,并且可以有不同的 特权级。 Intel 处理器使用中断门、陷阱门和任务门来定义处理程序的入口地址。其中,中断门和陷 阱门是进入异常处理程序的门户。选择符和偏移量合起来定义了一个处理程序的入口地址。 中断门进入处理程序时 IF 标志被清掉,而陷阱门进入处理程序时 IF 标志保持不变。 Intel 处理器为每个中断和异常定义了一个中断向量号,并通过中断描述符表(IDT)建立 中断向量号和门之间的对应关系。IDT 可以驻留在线性地址空间的任何位置。Intel 处理器 专门提供了一个 IDTR 寄存器来记录 IDT 的基地址和界限信息。 Intel 处理器定义了 256 个中断向量号,其中 0~31 被处理器保留。 处理器中的异常可以 分为故障类异常和终止类异常。故障类异常可以被更正,而终止类异常则是无法被处理器自 行解决的严重错误。为了保证安全性,通过中断门或陷阱门只能向同级或更高特权级的代码 段转移控制。通常情况下,处理程序定义在内核代码段中(0 特权级代码段)。 在中断发 生时,处理器会自动在栈顶压入一些参数,其中 EFLAGS 是中断或异常发生前的系统状 态,SS:ESP 是中断或者异常发生前用户堆栈的栈顶,CS:EIP 是中断或者异常的返回地址。 64 位模式中,处理程序必须在 64 位代码段中,因而中断和陷阱门描述符被扩充到了 16 字节,其中偏移量被扩充到了 64 位;IDT 找那个仅有新格式的门描述符;堆栈宽度变成了 64 位,而且当中断发生时,会无条件地压入栈指针(SS:RSP)当需要切换堆栈时 SS 被强 制设置为 NULL;新增了中断堆栈表(IST)机制,允许特定的中断或者异常指定专门的堆 栈。

2021年9月30日

Intel x86处理器内存保护 概要知识点

一旦处理器内存保护机制被启动,处理器就会对每一次内存访问进行保护性检查,以确保所 有的访问都满足保护策略。保护检查和地址转换是并行进行的。 保护检查包含段级检查和页级检查。检查顺序是先段后页,检查依据是段描述符,页目录和 页表,检查的基础是特权级。 特权级是 Intel 为实现保护而定义的特权编号。 段一级的检查包括段界限检查,段类型检查,特权级检查,长指针检查等。段一级检查的原 则是: 低特权级的代码不能访问高特权级的数据 高特权级的代码可以访问低特权级的数据 代码只能使用与其特权级相同的堆栈,当特权级切换时,堆栈也要随之切换。 只能向具有相同特权级的非相容代码段转移控制(长 JMP 和长 CALL) 可以向同等或者较高特权级的相容代码段转移控制,但不能向低特权级的相容代码段转 移控制(长 JMP 和长 CALL)。 即使调用门、中断门、陷阱门,也不能从高特权级向低特权级转移控制。 不允许使用长 RET 向高特权级转移控制。 页一级的检查包括特权级检查和读写检查。相关标志是页目录/页表项中的 U/S 和 R/W 位。U/S 位 0 的页是超级页,为 1 是代表用户页。一般情况下,超级页中的代码可以访问 所有页(不管 R/W 标志),用户页中的代码只能访问用户页。当 CR0.WP 被设置为 1 时, 超级页中的代码也不能写只读用户页。 NXB 为 1 的页只能用作数据页,试图执行数据页的指令会引起处理器异常。

2021年9月30日

intel 64 体系常见内存管理方式

内存管理是操作系统中非常重要的一个部分。随着计算机技术的不断发展,内存管理的方式 也在不断演变。本文将介绍 intel 64 体系几种常见的内存管理方式。 平板式内存管理是一种比较简单的内存管理方式。它采用页式管理,屏蔽掉段式管理。具体 来说,它将逻辑地址直接映射为线性地址,定义一个代码段和一个数据段,两个段的大小都 是 4GB。这种方式的好处是简单易懂,但是它的缺点是不能进行多进程的内存隔离。 为了解决多进程内存隔离的问题,可以采用保护平板式内存管理的方式。具体来说,它定义 了内核代码段、内核数据段、用户代码段和用户数据段,每个段的基地址都是 0,大小为 4GB。进程执行内核代码时使用内核段,执行用户代码时使用用户段。这种方式的好处是可 以进行多进程的内存隔离,但是它的缺点是需要进行地址转化,影响效率。多段式内存管理 是一种完全采用段式管理的方式,屏蔽掉页式管理。它可以进行多进程的内存隔离,但是需 要进行地址转化,也会影响效率。 基于物理地址拓展的页式内存管理是一种支持更大物理地址空间的方式。它引入了物理地址 拓展(PAE)机制以支持 36 位物理地址。该管理模式中,物理地址空间被扩充到了 64GB, 但线性地址空间仍然为 4GB。页目录和页表项被扩充到了 64 位,因而一个页目录或者页表 中的项数变成了 512,一个页目录仅能描述 1GB 线性地址空间。所以引入了一个只有四个 表项的页目录指针表(PDP)。CR3 指向 PDP。地址转换机制被修改。当页目录项中的 PS 位被设置为 1 时,它描述的页变成了 2MB 页。 在 64 位模式中,段通常被关闭,不再做段界限检查。CS,DS,ES,SS 的基地址处理器统 统看作 0。但 FS 和 GS 可以不是 0,将逻辑地址转换为先行地址的时候要加上 FS 或者 GS 的基地址。FS 和 GS 的基地址位 64 位地址,兼容模式中只使用它的低 32 位,记录在 MSR 中。在 64 位模式中,对于内存的管理完全依靠分页机制。 Intel64 体系结构扩展了 PAE 机制,使之能够支持 64 位线性地址和 52 位物理地址。拓 展包括: ...

2021年9月30日

段页式内存管理概要

段页式内存管理中,段的线性地址被分割成大小相等的线性页(4KB,4MB 或者 2MB 等)。 物理内存空间同样也被分成相同大小的物理页。操作系统维护一个页表,用于管理线性页到 物理页的映射。页表在 IA-32 体系结构中分为两级,即页目录和页表 页目录是一个数组,其元素叫做页目录项(PDE),每个页目录项描述一个页表。页目录的 大小为一页(4KB),一个页目录中有 1024 个页目录项。页目录项的大小为 4 字节。页表 大小为一页(4KB)。页表项的大小为 4 字节,所以一个页表最多可以描述 1024 个线性 页。 物理页是预先划分好的,其开始位置一定在 4KB(2^12)的边界上。所以低 12 位全部是 零。然后低 12 位就可以储存而外的信息。 P 是存在位。R/W 是读写标志位。U/S 是用户标志位,0 表示超级用户。A 是存取标志 位。D 是脏标志位。 在页目录项中 PAT 标志换成了 PS 标志,表示物理页尺寸。 CR3 寄存器专门存放当前使用的页目录的物理地址,因此 CR3 又叫做页目录基地址寄存 器。只要进程在活动,它的页目录就应该一直驻留在内存。 页目录项也可以直接指向物理页,加快地址转换速度,通常将操作系统内核所占用的页设置 为 4MB 页。该页目录项的 PS 地址为 1 事,它所描述的是一个 4MB 的页而不再是一个页 表。 页式管理机制是操作系统内核启动的,启动方法是将 CR0 中的 PG 标志设置为 1。 启动分页机制后,每个线性地址都需要经过页目录和页表的转换。IA-32 体系结构加入了一 个高速缓存 TIB,其中储存最近使用的页目录和页表项。TIB 的经常的刷新工作由操作系统 内核负责。当页目录和页表项改变时,内核必须使得 TIB 相应的项失效。当 CR3 改变 时,TIB 中的所有内容(Global 页除外)会自动失效。INVLPG 指令可以将 TLB 中的指定 项设置为无效。 ...

2021年9月30日

段内存管理概要

IA-32 体系中提供了段页式内存管理机制,先分段再分页。提供页式是为了支持虚拟内存。 段:处理器的可寻址的线性内存空间被划分成了若干个大小不同的段。一个段是线性地址 空间中的一个连续的区间。段中可保存代码、数据、堆栈或者其他数据结构。段的属性信 息由与之对应的段描述符描述。段描述符是一个数据结构。Intel 用段描述符表来管理。 段描述符表最大可达 64KB。 当 G 为 0 时,段以字节为单位,最大的段长为 1MB。当 G 为 1 时,段以页(4kb) 为单位。最大的段长为 4GB。 DPL 是段的特权级,其值在 0~3 之间。 S 是系统标志,用于区分段的类别。0 表示系统段,1 表示用户段。 Type 是段的类型: 对于系统段。类型域由 4 位组成,可表示 16 个系统段类型之一。 对于用户段。 第三位为 0 表示数据段,此时第二位表示地址的拓展方向(0 表示大扩展方 向),第一位表示段是否可写。 第三位为 1 表示代码段,此时第二位是相容标志(0 表示非相容)。第一位是可 读位。 第 0 位是存取位。0 表示段尚未存取过。 D/B 标志表示有效地址和操作数长度。 L 标志仅出现在 IA-32e 模式的代码段中。1 表示 64 位模式 堆栈段通常是向下扩展的、可读写的数据段。 段描述符表: 全局描述符表(GDT)。在系统进入保护模式前必须为其定义一个 GDT。IA-32 体系结 构专门定义了一个 GDTR 寄存器来存放当前的 GDT 的信息。 局部描述符表(LDT)是系统段,其中可以存放局部描述符,如进程自己的代码段,数 据段等。IA-32 体系专门提供了一个 LDTR 寄存器,用于保存当前使用的 LDT 信息。 可以用段描述符在段描述符表中的索引来标识它,标识称作段选择符。段选择符是 16 位标 识符。第二位是指示器(TI)表示索引所对的描述符表(0 表示 GDT)。第 3-15 位示索 引,标定位置。第 0、1 位是请求特权级 RPL。一个段选择符加上一个偏移量可以唯一地标 识一个逻辑地址。逻辑地址是程序使用的地址,不是线性地址,也不是物理地址。 ...

2021年9月30日

了解计算机系统内部运作:内存、I/O设备、总线和外存是如何协同工作的?

内存是处理器可以直接访问的储存空间。为了加快内存访问速度,计算机系统中通常提供 了一些高速缓存(Cache),高速缓存通常由硬件管理。 I/O 设备由 I/O 控制器和物理设备组成,处理器通过 I/O 控制器管理物理设备。I/O 控 制器主要由控制与状态寄存器(CSR)和数据寄存器组成。处理器通过读 CSR 来获得设备 状态,通过写 CSR 来控制设备动作,通过读写数据寄存器来交换数据。内核通常将 I/O 设备抽象成一组寄存器,并给一个寄存器一个 I/O 地址。处理器通过 I/O 地址访问 I/O 寄存器。 现代计算机系统中许多设备寄存器可以被映射到物理地址空间中。此时,每个设备寄存器 都有一个物理内存地址。这种方式的 I/O 称为内存映射 I/O。使用方便但是会消耗物理 内存地址。 通常把外存抽象成一个数据块的数组,每个数据块都有一个序号处理器可以通过序号随机 读、写外存中的任何一个数据块。对于外存的操作通常以块为单位,因此又称外存为块设 备。对应地,其他 I/O 设备称为字符设备。简而言之,块设备以块为单位进行数据的读 写操作,如硬盘、闪存等;字符设备以字符为单位进行数据的读写操作,如键盘、鼠标、 打印机等。 总线负责将处理器,内存,I/O 控制器连接起来。常用的总线有 ISA、PCI、PCI-E、AGP、ATA、SCSI 等。总线还负责检测,枚举接在其上的设备。

2021年9月30日

IA-32体系概要

IA-32 体系结构中由三种模式和一种准操作结构: 实模式:与 8086 兼容的操作模式,有一些拓展。 保护模式:处理器的一种最基本的操作模式,在这种模式中,处理器的所有指令及体系结 构中的所有特色都是可用的,并且能够达到最高性能。 系统管理模式,提供给操作系统的一种透明的管理机制,用于实现电源管理等特殊操作。 虚拟 8086 模式是一个准操作模式,允许处理器在保护模式中执行实模式的程序。 Intel 64 体系结构新增一种 IA-32e 操作模式包含两个子模式 兼容模式,在该模式下可以不加修改地运行大多数 IA-32 体系结构的程序 64 位模式,可以使用 64 位线性地址空间和一些新增加的特性。IA-32e 不再支持虚拟 8086 模式 处理器加电或者 Reset 后默认操作模式是实模式。 实模式和保护模式之间的转换由控制寄存器 CR0 中的 PE 位控制。 保护模式和 IA-32e 模式之间的转换由 IA32_EFER 寄存器中的 LME 和 CR0 中的 PE 位 控制。 兼容模式和 64 位模式之间的转换由代码段寄存器 CS 和 L 位控制。 保护模式和虚拟 8086 模式之间的转换由标志寄存器 EFLAGS 中的 VM 位控制。 进入系统管理模式的唯一途径是 SMI 中断,在系统管理模式中执行指令 RSM 会将处理器切 换回原来的操作模式。

2021年9月30日