X64内核之IA32e模式

环境配置

配置的详细文档(by 奥丁)
驱动编程学习3/Win10双机调试环境配置
工具 : Windbg(X64)
windbg 常用命令详解
注意: 如果Windbg提示Busy : Debugee is RunningCtrl + Pause/Break就可以继续输入命令

什么是IA32e模式

x86-64处理器的几种运行模式
实模式、保护模式、虚拟8086模式和IA-32e模式
英特尔® 64 位和 IA-32 架构软件开发人员手册,第 3A 卷:系统编程指南,第一部分
解释几个专业词汇:
IA32 : x86处理器架构。支持3种操作模式和一种类操作模式:

  • 实地址模式/实模式(real-address mode):在计算机上面,实模式存在的时间非常之短,所以一般我们是感觉不到它的存在的。CPU复位(reset)或加电(power on)的时候就是以实模式启动,在这个时候处理器以实模式工作,不能实现权限分级,也不能访问20位以上的地址线,也就是只能访问1M内存。之后一般就加载操作系统模块,进入保护模式。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。
  • 保护模式(protected mode):在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换和保护任务环境; 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟8086方式,便于执行8086程序。
    保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。­至此,进程(这时我们可以称程序为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有: SIGSEGV(linux 段错误);非法内存访问对话框(windows 对话框)。
    ­
    CPU启动环境为16位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式
  • 系统管理模式(system management mode - SMM):SMM是Intel在386SL之后引入x86体系结构的一种CPU的执行模式。系统管理模式只能通过系统管理中断(System Management Interrupt, SMI)进入,并只能通过执行RSM指令退出。SMM模式对操作系统透明,换句话说,操作系统根本不知道系统何时进入SMM模式,也无法感知SMM模式曾经执行过。为了实现SMM,Intel在其CPU上新增了一个引脚SMI# Pin,当这个引脚上为高电平的时候,CPU会进入该模式。在SMM模式下一切被都屏蔽,包括所有的中断。SMM模式下的执行的程序被称作SMM处理程序,所有的SMM处理程序只能在称作系统管理内存(System Management RAM,SMRAM)的空间内运行。 这样SMM专用的代码可以透明地执行(即操作系统/应用程序不受SMM模式的代码影响)。当退出SMM模式后,处理器被置于SMI之前的状态,继续执行被中断的程序/任务。可以通过设置SMBASE的寄存器来设置SMRAM的空间。SMM处理程序只能由系统固件实现。
  • 虚拟8086模式(即上述的类操作模式):在保护模式下,处理器支持这种被称为虚拟8086模式的类操作模式,使得处理器可以在受保护的,多任务环境下执行8086软件。是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。
    注:虚拟8086模式不是一种独立的操作模式,可以看作是保护模式下的一个特殊子模式,用于执行8086的实模式指令,但是不同于处理器位于实地址模式
    Intel 64架构 : x64处理器架构。支持IA-32架构上的所有模式,以及新的IA-32e模式:
  • IA-32e模式:在IA-32e模式,处理器支持2种子模式:兼容模式与64位模式。64位模式提供了64位的线性地址寻址方式,支持超过64G字节的物理地址空间。兼容模式允许大多数传统的保护模式的程序无需修改即可运行。
    模式区分总结:
  • Legacy Mode:内核32位,用户32位
    支持非平坦段,任务切换,虚拟8086,实模式等(这些下面会进行详细的解释)
  • Long Mode:内核64位,64位模式用户必须64位,兼容模式用户64位或者32位
    强制平坦段(段基址不能随便设),不支持任务切换

计算机怎样进入IA-32e模式

开机时,计算机是实模式,之后会读取MSR寄存器[ C0000080H ],通过写操作,将MSR的第八位置一,计算机就会进入IA-32e模式,当系统稳定后,将一直处于IA-32e模式。

Windbg查看MSR内容命令rdmsr C0000080(第八位是从低位开始,从0开始计数)

段描述符

保护模式的段描述符(图来自Intel手册)
保护模式的段描述符IA-32e的CS段描述符(图来自Intel手册)
IA-32e的CS段描述符
通过比较,可以看到64位段描述符没有进行扩展,因为本身已经是64位;由于虚拟地址控件从32位扩展到了64位,段描述符就不放基址和界限,强制平坦

段描述符中的重要位:第21位,L,判断代码是在64位模式还是兼容模式;
DPL,描述符特权级字段(Descriptor privilege level):用于指明描述符的特权级。特权级范围从0到3。0级特权级最高,3级最低。DPL用于控制对段的访问

Windbg查看全局段描述符表(GDT) dq gdtr

查看某一个段描述符 dg 10
Windbg命令
可以看出该段在R0层64位代码段
在这里插入图片描述

TSS段

IA-32e模式中的代码段和数据段使用64位段描述符,强制平坦(FS,GS除外)

TSS(Task State Segment)段描述符扩展到128位,不再强制平坦,基址和界限可以用来去寻找内存空间,存放权限切换的栈指针,不用来任务切换,内存地址计算方式如下图所示
tss

根据TSS找栈指针

64位模式的TSS结构(图来自Intel手册)
TSS结构包含以下信息
• RSPn — 权限级别0-2的64位堆栈指针(RSP).
• ISTn — 64位中断堆栈表(IST)指针.
• I/O map base address — 从64位TSS基址到16位I/O权限位映射的偏移量.
注意 :通过TSS段描述表找内存地址时,需要加4才是第一个堆栈指针,因为有四位保留位

IDT

IDT(Interrupt Discriptor Table)将每个异常、中断向量与为其提供服务的过程或任务的门描述符相关联。IDT可以包含以下三种类型的门描述符中的任何一种:

  • 任务门描述符
  • 中断门描述符
  • 自陷门描述符
    IDT与IDTR的联系

中断门描述符,同样扩展到128位