探究计算机中断处理:了解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)机制,允许特定的中断或者异常指定专门的堆栈。

九月 30, 2021

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

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

九月 30, 2021

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位物理地址。拓展包括: 页目录指针表被扩充到了512项。 引入了一个第四级页映射表PML4,它的每一个表项可以指向一个PDP。 所有的四级页表表项被扩充到了64位。 页目录项中的PS标志用于控制4KB和2MB页。 所有页表项在第63位上新增了一个执行禁止标志EXB。

九月 30, 2021

段页式内存管理概要

段页式内存管理中,段的线性地址被分割成大小相等的线性页(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中的指定项设置为无效。

九月 30, 2021

段内存管理概要

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。一个段选择符加上一个偏移量可以唯一地标识一个逻辑地址。逻辑地址是程序使用的地址,不是线性地址,也不是物理地址。 IA-32体系提供了6个段寄存器,即CS,SS,DS,ES,FS和GS。每一个段寄存器可以缓存一个段描述符。

九月 30, 2021

了解计算机系统内部运作:内存、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等。总线还负责检测,枚举接在其上的设备。

九月 30, 2021

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会将处理器切换回原来的操作模式。

九月 30, 2021