I/O敏感指令
2015-11-24 19:16
369 查看
输入输出特权级(I/O Privilege Level)规定了可以执行所有与I/O相关的指令和访问I/O空间中所有地址的最外层特权级。IOPL的值在如下图所示的标志寄存器中。
I/O许可位图规定了I/O空间中的哪些地址可以由在任何特权级执行的程序所访问。I/O许可位图在任务状态段TSS中。
上表所列指令称为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敏感指令在实模式下总是可执行的
标 志 寄存器 | BIT31—BIT18 | BIT17 | BIT16 | BIT15 | BIT14 | BIT13—BIT12 | BIT11 | BIT10 | BIT9 | BIT8 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
00000000000000 | V M | R F | 0 | N T | IOPL | OF | D F | I F | T F | S F | Z F | 0 | A F | 0 | P F | 1 | C F |
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位图许可 |
由于每个任务使用各自的EFLAGS值和拥有自己的TSS,所以每个任务可以有不同的IOPL,并且可以定义不同的I/O许可位图。注意,这些I/O敏感指令在实模式下总是可执行的
相关文章推荐
- python 从shell读取指定文件以及写入指定文件
- Android app优化策略
- Codeforces 505B __Mr. Kitayuta's Colorful Graph(floyd)
- 【Quartz】配置最简单的集群
- Python计算机视觉编程练习7:文件操作
- BIOS程序
- AudioManager类:调节系统各种音量
- 漫游红黑树之插入篇 http://www.cnblogs.com/xuqiang/archive/2011/05/16/2047001.html
- cvbs 波形解析
- 【Quartz】将定时任务持久化到数据库
- Android Studio的插件开发
- The page is performing an async postback but the ScriptManager
- Android_改变状态栏颜色
- 用PYTHON硬写SOCKET
- UVA - 11584 划分字符串的回文串子串; 简单dp
- uva11722 - Joining with Friend(几何概率)
- Handler、Message、MessageQueue、Looper调用过程源码浅析
- git操作---版本返回
- Android Log工具之Luffy
- HDU 1072 Nightmare(DFS或BFS+剪枝)