手动更改 RFLAGS 寄存器

Manual alteration of RFLAGS register

根据维基百科,RFLAGS 寄存器在 x64 架构中包含一些特殊值,例如保留值和 I/O 特权级别。我想知道是否可以将状态寄存器压入堆栈,修改它然后将其弹回。

我也怀疑操作系统是否可以阻止这种情况,或者它们是否允许这种篡改。我在想这样的事情:

pushfq                 # pushing onto the stack
pop rax                # loading the value in rax
xor rax, 0xcafebabe    # performing some random operation
push rax               # pushing the brand new RFLAGS 
popfq                  # popping it back

是的,你可以做到。但是,如果您在没有足够特权的情况下更改特权标志,则不会修改相关标志。具体规则有点复杂,详见manual