x86 32位机的特权保护

优先级划分、指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础。本文将试图讲解为大家解决两大问题:

--win32汇编中为什么找不到中断指令的应用?比如int 7ch

--windows错误的‘蓝屏’是从哪里来的?

保护模式下,中断或异常往往从用户代码切换到操作系统代码中执行。由于保护模式下的代码有优先级之分,因此出现从优先级低的应用程序转移到优先级高的系统代码的问题,如果优先级低的代码能够任意调用优先级高的代码,就相当于了拥有了高优先级代码的权限。为了使高优先级代码能够安全的被低优先级代码调用,保护模式下增加了‘门’的概念。

门指向某个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,进入门所规定的入口点。这样就可以避免低级别的程序代码从任意位置进入优先级高的程序的问题。

保护模式下的中断和异常等服务也需要从‘门’进入,80386的门分为中断们、自陷门和任务门。

保护模式把所有的中断描述符放在一起组成中断描述符表IDT,为此80386处理器引入了一个新的48位寄存器IDTR。IDTR的高32位指定了IDT在内存中的基址(线性地址),低16位指定了IDT的长度,相当于指定了可以去支持的中断数量。

保护模式发生异常或者中断时,处理器先根据IDTR寄存器得到的中断描述符的地址,然后取出n号中断/异常的门描述符,再从描述符中取得中断服务程序的地址xxxx:yyyyyyyy,经过段地址转换后得到服务程序的32为线性地址并转移后执行。

windows中,操作系统使用动态链接库代替中断服务程序提供系统功能,所以win32汇编中int指令也就失去存在的意义。这就是在win32汇编中看不到int指令的原因,其实那么调用API的指令就相当于在DOS系统中使用int指令完成系统功能。

保护机制主要在下面几个方面:

段类型检查:由段描述符指定的

页类型检查

访问数据时的级别检查:

--优先级低的代码不能访问优先级高的数据段。80386的段描述符中有一个DPL(描述符优先级),表示这个段可以被访问的最低优先级

--而段选择符中含有RPL域(请求优先级),表示当前执行代码的优先级

知道有当DPL大于RPL时才可访问

以上是windows规定的保护条例,如果某个程序违反了,那么引发保护异常,这样就会蓝屏告诉用户试图访问不存在的内存。

x86 32位机的特权保护

时间: 2024-10-30 15:56:34

x86 32位机的特权保护的相关文章

32位机内存管理机制(上)

一直有看linux内核的冲动,内核有些部分是汇编编写的,无奈汇编不大懂,所以利用五一三天假期大概走了一边8086CPU架构的汇编,8086CPU还是16位的,我们现在都进入64位时代了,这两者之间有很大的区别,但是看看16位的CPU汇编还是很重要的,这有助于理解32位的80386CPU.这篇文章来分析下80386的内存管理的一些基础知识,包括实模式.保护模式和内存寻址等等. 1.实模式 处理器被复位或者加电的时候以实模式启动.这时候处理器中各寄存器以实模式的初始化值工作. 80386处理器在实模

32位机内存管理(下)

既然这样,段描述符表放在那里呢?80386中引入了两个新的寄存器来管理描述符表.一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR.那么,为什么有两个描述符表寄存器呢? GDTR指向的描述符表为全局描述符表GDT.它包含操作系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段.数据段.堆栈段的描述符及各任务的LDT段等,全局描述符表只有一个. LDTR则指向局部描述符表LDT.80386处理器设计成每个任务都有一个独立的LDT.它包含有每个任务私有的

32位机与64位机数据大小

32位机与64位机数据大小 32位编译器: char :1个字节       char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节.同理64位编译器) short int : 2个字节 int:  4个字节 unsigned int : 4个字节 float:  4个字节 double:   8个字节 long:   4个字节 long long:  8个字节 unsigned long:  4个字节 64位编译器: char :1个字节 char*

X86 32位的基本寄存器

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/35268489 下面的寄存器前缀名E代表32,也就是说每个寄存器,可以拆分成两个16位寄存器. 1个指令指针寄存器(EIP) 4个数据寄存器(EAX.EBX.ECX和EDX) 2个栈指针寄存器(ESP和EBP) 2个变址寄存器(ESI和EDI) 6个段寄存器(ES.CS.SS.DS.FS和GS) 1个标志寄存器(EFlags) 1个任务管理寄存器(TR

为什么有的程序在64位机上跑反而比32位机更慢

最近工作遇到了一个问题,原本在32位Android机上跑的好好的程序,在某些64位机上却变慢了许多.感觉很奇怪,所以google了一下原因,网上给出的原因大部分是过多使用指针.可是为什么过多使用指针就会造成程序变慢呢?结合网上的资料,和自己的理解,我认为是如下原因造成的: (1)因为64位比32位的指针大了一倍,寻址空间从2^32大幅上升到2^64,但是这也带来了额外的问题.一个指针的存储空间也变成了原来的两倍,在做指针运算时,例如int*ptr,*(ptr+5),移动距离也变为了原来的两倍.

32位机 64位机 32位操作系统 64位操作系统

32位机: 一般指的是32位的CPU就是说CUP一次能计算32位. 64位机: 一般指的是64位的CPU就是说CPU一次能计算64位. 32位操作系统: 为32位机而制作的.指的是操作系统的字长是32位的 ,也就间接的影响了地址总线,因此,最大寻址空间也就自然是2的32次方,4G.注意:32位操作系统只能安装再32位机子上. 64位操作系统: 为64位机而制作的.指的是操作系统的字长是64位的,也就间接的影响了地址空闲,因此最大寻址空间也就是2的64次方,128G.注意:64位操作系统可以安装在

c# 32位机和64位机 读取Excel内容到DataSet

// ----------------------32位机 //注释说明 //ExclePath 为Excel路径 批号 是指Excel文件中某一列必填项 public static DataSet GetDataTableForExcel(String ExclePath) { string strCon = String.Empty; strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExclePath + &qu

Windows Server 2003 Enterprise Edition x86 (32位)微软官方原版

Windows Server 2003 Enterprise Edition x86 (32位)微软官方原版 ,发布日期是2003年03月27日20:00.在2003.04.17微软官方又重新发布了此版系统,目前在MSDN上可查阅的也是2003-04-17这个版本. Windows Server 2003下载:2003-03-27原版文件校验信息: 文件名: sc_windows_server_2003_enterprise.iso卷标: NRMEVOL_CN.iso发布日期 (UTC): 3/

32位机和64位机的区别及基本数据类型占字节数

一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍.但这是建立在64bit操作系统,64bit软件的基础上的. 什么是64位处理器? 之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力也是2的倍数.8位处理器.16位处理器.32位处理器和64位处理器,其计数都是2的倍数.一次处理的数据越大,该电