Windows操作系统总结(2)保护模式

实模式和保护模式的一个重要区别在于对虚拟内存的使用。

实模式时程序是通过段基址+偏移地址直接访问物理内存,程序与程序,程序与系统都可以访问和修改相互之间的物理内存,如果没有事先知晓各自的内存空间位置,很可能造成非法访问,系统崩溃。

在保护模式下,处理器提供了很多内部支持,系统可以利用这些CPU层面的支持规范物理内存的读写和指令的执行。

1.全局描述符表:处理器提供支持为各段内存设置属性,以规范内存使用,每个段描述符都包含该段的起始位置,段的范围和它的访问属性,处理器访问内存时会通过相应的段寄存器获取相应的描述符属性,如果不符合规范,处理器将会终止指令,并产生一个内部中断异常给系统,系统通过处理这种异常控制内存访问,段描述符如下

32位的段基址:80286处理器的遗留问题因此没有连在一起,限制了内存段的起始位置

20位的段界限:同样是遗留问题,对于相上扩展的段如代码段数据段,限制了偏移量最大值,对于相下扩展的段如栈段,限制了偏移量的最小值,实际的约束范围与G位有关

G位为粒度位(Granularity):G位置0时是以字节为单位,也就是FF,G位置1时是以4KB为单位,也就是0xFFF。同样一个内存页也是4KB,系统分配内存和销毁内存也是以也为单位。将G置1时,20位的段界限也就是0xFFFFF就能表示32位4GB内存空间任意一个内存页

S位为描述符类型(Descriptor Type):G位置0时表示是一个系统段,G位置1时表示是一个代码段或数据段

2位的DPL为描述符权限级别(Descriptor Privilege Level):从0到3,值越小权限越高,用户态代码的DPL=3,内核态代码DPL=0,某些处理器特权指令只能在DPL=0的状态下才能执行,这样可以增加系统安全

P位为段存在位(Segment Present):表示该描述符是否存在,如果P位为0,访问该描述符就会产生一个异常中断

D/B位为“默认操作数大小”(Default Operation Size):也就是为了兼容16位保护模式程序(尽管很罕见),对于代码段,该位表示D,当D=1时使用32位操作数,如32位EIP取指令,D=0时使用16位操作数,如16位IP取指令,对于栈段,该位表示B,当B=1时使用32位操作数,如32位ESP进行栈操作,D=0时使用16位操作数,如16位SP进行栈操作,

L位为64位保留位,在32位下置0即可

AVL位也就是软件可以使用的位(Availabe),通常也用不上

4位Type表示描述符类别:

Type的X位表示该描述符是数据段还是代码段,也就是是否可执行

对数据段来说E位表示数据的扩展方向,也就是区分通常的数据段和栈段,W位表示该段是否可写

对代码段来说C位表示特权级依从,与DPL值有关,R位表示该段是否可读

Type的A位表示该段最近是否访问过,访问后自动置1,清零通常由操作系统来做,从而统计使用频率

安装完所有描述符后可以通过lgdt指令指定描述符表的线性基地址和界限到GDTR寄存器保存,访问描述符表时就可以通过GDTR基址偏移访问

2.实模式和保护模式的开关CR0:将CR0寄存器的PE位(保护模式允许位)置1,处理器进入保护模式

    mov eax,cr0
    or eax,1
    mov cr0,eax                        ;设置PE位

3.保护模式地址变换的保护

代码执行的保护:

每当处理器取指令和执行指令时,都会通过访问CS段寄存器的描述符高速缓存器获取当前代码的段基地址和段界限以及其他属性,将代码的段基地址和EIP相加,形成实际的物理地址,并确认地址是否超过了段界限,实际的段界限和段描述符的G位有关,某些指令的执行和DPL有关

栈操作的保护:

同样如push,pop,call,ret等指令,都会访问SS段寄存器的描述符高速缓存器获取当前栈的段基地址和段界限,约束栈操作空间

数据访问的保护:

在32位系统中,程序在用户态执行如mov eax,[0xA0000000]的指令是不被允许的,在指令访问内存地址之前,通常会访问DS段寄存器的描述符高速缓存器获取当前栈的段基地址和段界限以及段属性,段基地址和段界限规范了当前程序可以访问的内存范围

4.中断处理机制

中断分为软件中断和硬件中断,软断如调用int 3等指令产生,硬度通常由IO设备发出中断信号引起。

中断发生时,处理器将挂起当前处理线程,并保存当前线程的上下文,并执行中断例程,执行完成后,恢复线程上下文继续执行,使线程执行起来看起来是连续的,16位时通过中断向量表保存不同中断例程调用地址和属性,32位后通过中断描述符表(IDT)执行相同功能,类似于全局描述符表,中断描述符表通过lidt指令指定描述符表的线性基地址和界限到IDTR寄存器保存,访问描述符表时就可以通过IDTR基址偏移访问,IDT结构如下

中断选择子类似与段选择子,都是通过它来选择对应的描述符,DPL段描述符特权级别,P位表示是否存在

,D位表示32位还是16位

(未完待续)

发布了23 篇原创文章 · 获赞 0 · 访问量 2022

猜你喜欢

转载自blog.csdn.net/qq_33913982/article/details/104073973
今日推荐