在受保护模式的x86上运行的自定义操作系统中,有没有办法获得当前的权限级别,除了例如执行特权指令并查看它是否崩溃?
例如,寄存器CR0
包含PE
位,表示我们是在实模式还是保护模式下运行,并且可以使用汇编代码轻松检索。
是否存在与特权级别相同的内容?
Intel architecture software developer manual提到EFLAGS
寄存器包含两个与I / O权限级别相关的IOPL
位。这与当前特权级别(CPL)相同吗?
答案 0 :(得分:4)
不,不一样。那些代表io特权级别。某些说明(例如IN
,OUT
,CLI
需要使用IOPL
和CPL
确定的权限。
另见:
IOPL I / O特权级别字段(位12和13) - 表示I / O. 特权 当前正在运行的程序或任务的级别(IOPL)。 CPL的 当前运行的程序或任务必须小于或等于IOPL 访问I / O地址空间。
CPL
只能从CS
选择器中读取为两个最低位:
mov ax, cs
and ax, 3
这当然只适用于保护模式。