zoukankan      html  css  js  c++  java
  • Kernel Mode, User Mode

    之前关于kernel mode,user mode之间的切换,有个问题一直有些疑惑。

    一个进程有没有办法,从user mode切换到kernel mode去执行自己的代码。我知道答案肯定是不行,但是为啥不行,一直不太清楚。

    今天看了点东西,算是有了解答。

    首先,cpu有ring0,ring1,ring2,ring3这4个级别,windows只用了ring0,ring3,其实kernel mode = ring0, user mode=ring3.

    Ring3下有些指令是不能执行的,如:lgdt,lldt,ltr...

    系统有维护一张GDT的table(call gate,调用门),user mode想切换到kernel mode需要调用call,jmp指向一个远指针, 指向的code必须在GDT的table里才可以。

    而Table的内容存放在一块memory里,只有Ring0才能访问,除非有漏洞,否则,user mode的代码是没办法进入Ring0去为所欲为的。

    有一个漏洞,让Ring3有机会去修改GDT,Ring3可以执行sgdt拿到GDT的虚拟地址,根据Mapping关系,算出物理地址,open DevicePhysicalMemory,去修改这块物理地址。

    修改GDT,添加自己的call gate。

  • 相关阅读:
    汇编指令
    汇编指令
    汇编指令
    字在寄存器中的存储
    汇编指令
    字在寄存器中的存储
    汇编指令
    8086CPU的8位寄存器数据存储情况
    [转载]使用嵌入式 Tomcat 简化程序调试
    [转载]Java语法总结
  • 原文地址:https://www.cnblogs.com/zzSoftware/p/3311072.html
Copyright © 2011-2022 走看看