首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86 -将权限级别从CPL0更改为CPL3

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

Stack Overflow用户
提问于 2012-07-17 09:05:28
回答 1查看 2.9K关注 0票数 4

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-05 22:11:21

在x86中,如果您想将控制从较高特权级别传递回较低特权级别,则必须使用iret指令。根据iret指令期望的结构(ss、esp、eflag、cs && eip)手动创建堆栈顶部,并调用iret。

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

代码语言:javascript
运行
复制
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
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11514740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档