输入输出特权级(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 | 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许可位图规定了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敏感指令在实模式下总是可执行的。