|
|
发表于 2005-9-23 12:53:41
|
显示全部楼层
Post by gamedragon
原则上是这样,因为x86架构里有4层ring;但是在普通操作系统(我所知所有的)里,所有代码只有2个运行级别,0(内核)跟3(用户),这是为了兼容性考虑,因为不是所有的CPU架构都有4个级别。所以一般in/out之类的指令在95以后操作系统里都不好随便用的,一般都是通过构造一个中断去切入ring0,然后再使用这些指令。当然95、98里想用in/out更简单,因为保护的差;NT之后的就要复杂一点了。
从你的叙述中并没有看出in/out属于特权指令,只是一般情况下是在0特权级下使用.
If protected-mode virtual interrupts are not enabled, CLI clears the IF flag in the EFLAGS register. No other flags are affected. Clearing the IF flag causes the processor to ignore maskable external interrupts. The IF flag and the CLI and STI instruction have no affect on the generation of exceptions and NMI interrupts.
When protected-mode virtual interrupts are enabled, CPL is 3, and IOPL is less than 3; CLI clears the VIF flag in the EFLAGS register, leaving IF unaffected.
用这个指令还是有限制的,而且还提到了个VIF flag。所以说如果什么人都可以用sti/cli,那操作系统不就太容易崩溃了,因为最基本的调度都是基于时间中断的。这个中断一被禁止,操作系统基本就处于不活动状态了。
同样,这段描述也并没有看出cli/sti是特权指令.他只是通过某种手段(比如设置vif位)使cli/sti这样的指令在3特权级下不可用,但这并不代表cli/sti就是特权指令.
最后,并不是说在用户态不可用就是特权指令,也不是说不是特权指令就能在用户态下使用.
限制和特权指令是两回事,不能混为一谈 |
|