自定义操作系统上的当前 x86 权限级别

ano*_*nol 3 x86 assembly privilege

在保护模式下在 x86 上运行的自定义操作系统中,除了执行特权指令并查看它是否崩溃之外,有没有办法获得当前的特权级别?

例如,寄存器CR0包含PE位,指示我们是在实模式还是保护模式下运行,并且可以使用汇编代码轻松检索。

特权级别有什么等价的吗?

英特尔架构软件开发者手册提到,EFLAGS寄存器包含两个IOPL相关的I / O特权级别位。这与当前权限级别 (CPL) 相同吗?

Jes*_*ter 5

不,这不一样。那些代表 io 权限级别。某些指令(例如IN, OUTCLI需要使用IOPL和确定的 io 权限CPL

也可以看看:

IOPL I/O 权限级别字段(位 12 和 13)——表示当前运行的程序或任务的 I/O 权限级别 (IOPL)。当前运行的程序或任务的CPL必须小于或等于IOPL才能访问I/O地址空间。

CPL可以简单地从该被读取CS选择为最低的两个比特:

mov ax, cs
and ax, 3
Run Code Online (Sandbox Code Playgroud)

这当然仅适用于保护模式。

  • 确实,一旦你了解了它就非常简单,但在长达 3603 页的手册中搜索时却一点也不明显。 (2认同)