热搜关键词: 电路基础ADC数字信号处理封装库PLC

rar

汇编+保护模式+教程

  • 1星
  • 2014-03-05
  • 14.46MB
  • 需要1积分
  • 0次下载
标签: 汇编

汇编

保护模式

保护模式

教程

教程

九.输入/输出保护为了支持多任务,80386不仅要有效地实现任务隔离,而且还要有效地控制各任务的输入/输出,避免输入/输出冲突。本文将介绍输入输出保护。  这里下载本文源代码。  <一>输入/输出保护80386采用I/O特权级IPOL和I/O许可位图的方法来控制输入/输出,实现输入/输出保护。  1.I/O敏感指令输入输出特权级(I/O  Privilege  Level)规定了可以执行所有与I/O相关的指令和访问I/O空间中所有地址的最外层特权级。IOPL的值在如下图所示的标志寄存器中。  标    志寄存器  BIT31—BIT18  BIT17  BIT16  BIT15  BIT14  BIT13—BIT12  BIT11  BIT10  BIT9  BIT8  BIT7  BIT6  BIT5  BIT4  BIT3  BIT2  BIT1  BIT0  00000000000000  VM  RF  0  NT  IOPL  OF  DF  IF  TF  SF  ZF  0  AF  0  PF  1  CF  I/O许可位图规定了I/O空间中的哪些地址可以由在任何特权级执行的程序所访问。I/O许可位图在任务状态段TSS中。  I/O敏感指令  指令  功能  保护方式下的执行条件  CLI  清除EFLAGS中的IF位  CPL<=IOPL  STI  设置EFLAGS中的IF位  CPL<=IOPL  IN  从I/O地址读出数据  CPL<=IOPL或I/O位图许可  INS  从I/O地址读出字符串  CPL<=IOPL或I/O位图许可  OUT  向I/O地址写数据  CPL<=IOPL或I/O位图许可  OUTS  向I/O地址写字符串  CPL<=IOPL或I/O位图许可  上表所列指令称为I/O敏感指令,由于这些指令与I/O有关,并且只有在满足所列条件时才可以执行,所以把它们称为I/O敏感指令。从表中可见,当前特权级不在I/O特权级外层时,可以正常执行所列的全部I/O敏感指令;当特权级在I/O特权级外层时,执行CLI和STI指令将引起通用保护异常,而其它四条指令是否能够被执行要根据访问的I/O地址及I/O许可位图情况而定(在下面论述),如果条件不满足而执行,那么将引起出错码为0的通用保护异常。  由于每个任务使用各自的EFLAGS值和拥有自己的TSS,所以每个任务可以有不同的IOPL,并且可以定义不同的I/O许可位图。注意,这些I/O敏感指令在实模式下总是可执行的。  2.I/O许可位图如果只用IOPL限制I/O指令的执行是很不方便的,不能满足实际要求需要。因为这样做会使得在特权级3执行的应用程序要么可访问所有I/O地址,要么不可访问所有I/O地址。实际需要与此刚好相反,只允许任务甲的应用程序访问部分I/O地址,只允许任务乙的应用程序访问另一部分I/O地址,以避免任务甲和任务乙在访问I/O地址时发生冲突,从而避免任务甲和任务乙使用使用独享设备时发生冲突。  因此,在IOPL的基础上又采用了I/O许可位图。I/O许可位图由二进制位串组成。位串中的每一位依次对应一个I/O地址,位串的第0位对应I/O地址0,位串的第n位对应I/O地址n。如果位串中的第位为0,那么对应的I/O地址m可以由在任何特权级执行的程序访问;否则对应的I/O地址m只能由在IOPL特权级或更内层特权级执行的程序访问。如果在I/O外层特权级执行的程序访问位串中位值为1的位所对应的I/O地址,那么将引起通用保护异常。  I/O地址空间按字节进行编址。一条I/O指令最多可涉及四个I/O地址。在需要根据I/O位图决定是否可访问I/O地址的情况下,当一条I/O指令涉及多个I/O地址时,只有这多个I/O地址所对应的I/O许可位图中的位都为0时,该I/O指令才能被正常执行,如果对应位中任一位为1,就会引起通用保护异常。  80386支持的I/O地址空间大小是64K,所以构成I/O许可位图的二进制位串最大长度是64K个位,即位图的有效部分最大为8K字节。一个任务实际需要使用的I/O许可位图大小通常要远小于这个数目。  当前任务使用的I/O许可位图存储在当前任务TSS中低端的64K字节内。I/O许可位图总以字节为单位存储,所以位串所含的位数总被认为是8的倍数。从前文中所述的TSS格式可见,TSS内偏移66H的字确定I/O许可位图的开始偏移。由于I/O许可位图最长可达8K字节,所以开始偏移应小于56K,但必须大于等于104,因为TSS中前104字节为TSS的固定格式,用于保存任务的状态。  1.I/O访问许可检查细节保护模式下处理器在执行I/O指令时进行许可检查的细节如下所示。  (1)若CPL<=IOPL,则直接转步骤(8);(2)取得I/O位图开始偏移;(3)计算I/O地址对应位所在字节在I/O许可位图内的偏移;(4)计算位偏移以形成屏蔽码值,即计算I/O地址对应位在字节中的第几位;(5)把字节偏移加上位图开始偏移,再加1,所得值与TSS界限比较,若越界,则产生出错码为0的通用保护故障;(6)若不越界,则从位图中读对应字节及下一个字节;(7)把读出的两个字节与屏蔽码进行与运算,若结果不为0表示检查未通过,则产生出错码为0的通用保护故障;(8)进行I/O访问。设某一任务的TSS段如下:  TSSSEG                                    SEGMENT  PARA  USE16                                                TSS          <>                          ;TSS低端固定格式部分                                                DB            8  DUP(0)              ;对应I/O端口00H—3FH                                                DB            10000000B            ;对应I/O端口40H—47H                                                DB            01100000B            ;对用I/O端口48H—4FH                                                DB            8182  DUP(0ffH)  ;对应I/O端口50H—0FFFFH                                                DB            0FFH                      ;位图结束字节TSSLen                                    =              $TSSSEG                                    ENDS再假设IOPL=1,CPL=3。那么如下I/O指令有些能正常执行,有些会引起通用保护异常:                                                  in            al,21h    ;(1)正常执行                                                in            al,47h    ;(2)引起异常                                                out          20h,al    ;(3)正常实行                                                out          4eh,al    ;(4)引起异常                                                in            al,20h    ;(5)正常执行                                                out          20h,eax  ;(6)正常执行                                                out          4ch,ax    ;(7)引起异常                                                in            ax,46h    ;(8)引起异常                                                in            eax,42h  ;(9)正常执行由上述I/O许可检查的细节可见,不论是否必要,当进行许可位检查时,80386总是从I/O许可位图中读取两个字节。目的是为了尽快地执行I/O许可检查。一方面,常常要读取I/O许可位图的两个字节。例如,上面的第(8)条指令要对I/O位图中的两个位进行检查,其低位是某个字节的最高位,高位是下一个字节的最低位。可见即使只要检查两个位,也可能需要读取两个字节。另一方面,最多检查四个连续的位,即最多也只需读取两个字节。所以每次要读取两个字节。这也是在判别是否越界时再加1的原因。为此,为了避免在读取I/O许可位图的最高字节时产生越界,必须在I/O许可位图的最后填加一个全1的字节,即0FFH。此全1的字节应填加在最后一个位图字节之后,TSS界限范围之前,即让填加的全1字节在TSS界限之内。  I/O许可位图开始偏移加8K所得的值与TSS界限值二者中较小的值决定I/O许可位图的末端。当TSS的界限大于I/O许可位图开始偏移加8K时,I/O许可位图的有效部分就有8K字节,I/O许可检查全部根据全部根据该位图进行。当TSS的界限不大于I/O许可位图开始偏移加8K时,I/O许可位图有效部分就不到8K字节,于是对较小I/O地址访问的许可检查根据位图进行,而对较大I/O地址访问的许可检查总被认为不可访问而引起通用保护故障。因为这时会发生字节越界而引起通用保护异常,所以在这种情况下,可认为不足的I/O许可位图的高端部分全为1。利用这个特点,可大大节约TSS中I/O许可位图占用的存储单元,也就大大减小了TSS段的长度。  <二>重要标志保护输入输出的保护与存储在标志寄存器EFLAGS中的IOPL密切相关,显然不能允许随便地改变IOPL,否则就不能有效地实现输入输出保护。类似地,对EFLAGS中的IF位也必须加以保护,否则CLI和STI作为敏感指令对待是无意义的。此外,EFLAGS中的VM位决定着处理器是否按虚拟8086方式工作。  80386对EFLAGS中的这三个字段的处理比较特殊,只有在较高特权级执行的程序才能执行IRET、POPF、CLI和STI等指令改变它们。下表列出了不同特权级下对这三个字段的处理情况。  不同特权级对标志寄存器特殊字段的处理  特权级  VM标志字段  IOPL标志字段  IF标志字段  CPL=0  可变(初POPF指令外)  可变  可变  0    不变  不变  可变  CPL>IOPL  不变  不变  不变  从表中可见,只有在特权级0执行的程序才可以修改IOPL位及VM位;只能由相对于IOPL同级或更内层特权级执行的程序才可以修改IF位。与CLI和STI指令不同,在特权级不满足上述条件的情况下,当执行POPF指令和IRET指令时,如果试图修改这些字段中的任何一个字段,并不引起异常,但试图要修改的字段也未被修改,也不给出任何特别的信息。此外,指令POPF总不能改变VM位,而PUSHF指令所压入的标志中的VM位总为0。  <三>演示输入输出保护的实例(实例九)下面给出一个用于演示输入输出保护的实例。演示内容包括:I/O许可位图的作用、I/O敏感指令引起的异常和特权指令引起的异常;使用段间调用指令CALL通过任务门调用任务,实现任务嵌套。  1.演示步骤实例演示的内容比较丰富,具体演示步骤如下:(1)在实模式下做必要准备后,切换到保护模式;(2)进入保护模式的临时代码段后,把演示任务的TSS段描述符装入TR,并设置演示任务的堆栈;(3)进入演示代码段,演示代码段的特权级是0;(4)通过任务门调用测试任务1。测试任务1能够顺利进行;(5)通过任务门调用测试任务2。测试任务2演示由于违反I/O许可位图规定而导致通用保护异常;(6)通过任务门调用测试任务3。测试任务3演示I/O敏感指令如何引起通用保护异常;(7)通过任务门调用测试任务4。测试任务4演示特权指令如何引起通用保护异常;(8)从演示代码转临时代码,准备返回实模式;(9)返回实模式,并作结束处理。

展开预览

猜您喜欢

推荐帖子

智能家居五大问题待解
[导读] 本文由扫IC网平台提供,过去数年在硅谷颇受关注的智能家居在VR风潮中有点点失宠的迹象,从包括谷歌旗下的Nest公司到Quirky公司旗下的Wink公司都出现亏损现象。智能家居市场期盼的春天还没有到来,冬天却更冷了。 过去数年在硅谷颇受关注的智能家居在VR风潮中有点点失宠的迹象,从包括谷歌旗下的Nest公司到Quirky公司旗下的Wink公司都出现亏损现象。智能家居市场期盼的春天还没有
扫IC网`Allen 综合技术交流
基于FM1712的通用射频卡读写模块设计
         射频卡(非接触IC卡)是最近几年发展起来的一项新技术,与传统的接触式IC卡磁卡相比较,利用射频识别技术(radio frequency identifica-tion)开发的非接触式IC卡成功解决了无源和免接触等难题,是电子器件领域的一大突破。其高度安全保密性以及使用简单等特点,使之在各领域的应用异军突起。    引言         本文介绍的非接触射频卡读写器就是基于单片
Aguilera RF/无线
介绍DSP OMAP 程序耗时测定 CPU周期 两种方法
     我们在DSP开发中,测量某个函数或某段代码的cycles消耗是经常要做的事情,常用的profiling和clock()一般在simulation下使用,真正到了板子上做emulation时,因为要考虑到数据和被测code在板子上的存放位置和读取时间,用这种方法测结果就不那么可靠了。       其实在c64x+ core上有两个计数寄存器TSCL/TSCH,它们与CPU同频,共同表示一
fish001 DSP 与 ARM 处理器
失效分析的意义
1、失效分析是要找出失效原因,采取有效措施,使同类失效事故不再重复发生,可避免极大的经济损失和人员伤亡; 2、促进科学技术的发展 19世纪工业革命,蒸汽机的使用促进铁路运输,但连续发生多起因火车轴断裂,列车出轨事故。 大量断轴分析和试验研究表明:裂纹均从轮座内缘尖角处开始。认识到:金属在交变应力下,即使应力远低于金属的抗拉强度,经一定循环积累,也会发生断裂,即“疲劳”
advbj 模拟电子
串口通信与中断的关系
 串口通信分为发送/接收两部分,发送一般不需要中断即可完成发送,接收一般需要使用中断来接收。             发送方可以选择使用中断,也可以选择不使用中断。使用中断的工作情景是:发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter,transmitter耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以去做别的事情,等transmitter发送
fish001 DSP 与 ARM 处理器
利用DK112学习做反激开关电源
一直以来对开关电源制作感兴趣,也看过相关帖子,别人的成功制作让我蠢蠢欲动,下定决心也来DIY一下,经过半个月的准备,终于DIY成功,用一块DK112集成电路做了一款小功率的反激开关电源,设计输出电压15v、0.8A,但实际测量电压只有13.96V,可能第一次做没有经验,先带小负载通电运行一段时间,稳定了以后再来调试看看能不能把电压调高。 此内容由EEWORLD论坛网友zxhcdm原创,如需转
zxhcdm 电源技术

评论

登录/注册

意见反馈

求资源

回顶部

推荐内容

热门活动

热门器件

随便看看

  • MSP430-FLASH信息区学习
    [i=s] 本帖最后由 qiushenghua 于 2015-9-28 22:56 编辑 [/i][code]void flash_clr(int *ptr){_DINT(); //关中断FCTL3 = 0x0A500; //* Lock = 0 开锁FCTL1 = 0x0A502; //* Erase = 1 使能擦除*((int *) ptr) = 0; //* 擦除段}[/code]FLAS
  • 串口驱动
    我的电脑是WIN7系统的,买了一块51单片机的学习板,可是安装不到电脑上,听说得用USB转串口驱动,我下载了好几个,可是安装后也有很多问题,在设备管理器里面能看到USB2.0-Ser!一项,点击属性后提示“由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码 19)”求各路电脑高手指点迷津,是驱动与系统不兼容吗?最好能给个兼容的软件,以及正确的安装方法。谢谢:
  • 基于SOPC的数据发生系统设计
    [b]0 引 言[/b]  可编程片上系统(SOPC)是一种特殊的嵌入式系统,因为SOPC是片上系统(SoC),即由单个芯片完成整个系统的主要逻辑功能;SOPC是可编程系统,具有灵活的设计方式,可裁减,可扩充,可升级,并具备软硬件在系统可编程的功能;SOPC结合了SoC和FPGA的优点,涵盖了嵌入式系统设计技术的全部内容;SOPC涉及目前已引起普遍关注的软硬件协同设计技术。  现以数据发生系统为例
  • pinmux设置
    [align=left][color=#000]当我用pinmux配置软件设置引脚功能时,它会自动配置好IO 类型 是 PULLUP , PULLDOWN ,RXACTIVE等等。如果我要自己手动配置的话,我应该依据什么来确定把该引脚 设置成PULLUP PULLDOWN RXACTIVE呢。举个内核中的例子:[/color][/align][align=left][color=#000]stat
  • volatile的影响?
    以前使用volatile时,只是为了不让变量被优化每次都重新取值。昨天试了下这个函数,发现使用volatile和不使用volatile差别非常的大,如下:使用volatilevoid delay(volatile u32 nCount){for (; nCount != 0; nCount--);}不使用volatilevoid delay(u32 nCount){for (; nCount !=
  • 能求积分么?
  • 请问各位老师在这个开关电源上这些二极管是啥用途的作用分别是??
  • 【我给XILINX资源中心做贡献】给大家介绍一个Xilinx文档导航器
  • 问个很简单的问题stm32怎样加密啊?
  • PADS2007 如何导入图片(进阶篇)

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
×