x86-将权限级别从CPL0更改为CPL3

x86-将权限级别从CPL0更改为CPL3,x86,privilege,X86,Privilege,我正在编写一些低级操作系统代码(64位),并试图找出如何从CPL0切换到CPL3。问题是我在《英特尔开发人员手册》中遇到的一句话:“…处理器不允许将程序控制从以0、1或2的CPL运行的过程转移到以CPL或3运行的过程,除非返回。" TSS(任务状态段)甚至没有堆栈指针,那么CPL3代码将用于堆栈什么?我知道这是可能的(否则操作系统将如何启动任何应用程序代码)但是我找不到任何关于它的文档。似乎您必须将某些CPL3代码的地址推到堆栈上,以诱使处理器运行CPL3代码,但这听起来有点危险。你们知道更好的

我正在编写一些低级操作系统代码(64位),并试图找出如何从CPL0切换到CPL3。问题是我在《英特尔开发人员手册》中遇到的一句话:“…处理器不允许将程序控制从以0、1或2的CPL运行的过程转移到以CPL或3运行的过程,除非返回。"


TSS(任务状态段)甚至没有堆栈指针,那么CPL3代码将用于堆栈什么?我知道这是可能的(否则操作系统将如何启动任何应用程序代码)但是我找不到任何关于它的文档。似乎您必须将某些CPL3代码的地址推到堆栈上,以诱使处理器运行CPL3代码,但这听起来有点危险。你们知道更好的方法吗?非常感谢任何帮助。

在x86中,如果您想将控制权从更高的特权级别传递回来要减少特权,必须使用iret指令。根据iret指令(ss、esp、eflags、cs和eip)所需的结构手动创建堆栈顶部,然后调用iret

注意,示例是针对x86的。x64采用相同的方式,但使用另一个调节器,并且可能与预期的堆栈布局略有不同

VOID FASTCALL JumpFromCr0ToCr3(CONST ULONG cr3_eip, CONST USHORT cr3_cs , CONST ULONG cr3_flags, CONST ULONG cr3_esp, CONST USHORT cr3_ss)
{
    __asm
    {                               //        |     |
        push dword ptr [ESP + 0xC]; // ss     |  eip|<- stack pointer before iretd 
        push dword ptr [ESP + 0xC]; // esp    |   cs|
        push dword ptr [ESP + 0xC]; // flags  |flags|
        push            EDX       ; // cs     |   cs|
        push            ECX       ; // eip    |  eip|
                                  ;           -------
        iretd                     ;             top
    }
}
VOID来自CR0TOCR3的快速呼叫跳转(CONST-ULONG cr3\u eip、CONST-USHORT cr3\u cs、CONST-ULONG cr3\u标志、CONST-ULONG cr3\u esp、CONST-USHORT cr3\u ss)
{
__asm
{                               //        |     |

推送dword ptr[ESP+0xC];//ss | eip |当您说TSS甚至没有堆栈指针时,您的CPL3代码是第一次启动吗?编辑:您要查找的可能在内核堆栈上: