知道操作系统将高2G地址留给系统,而采用平坦寻址后特权级的限定就通过页表项属性来实现了,那么用户代码具体是怎么样转到系统代码里去的呢,也就是具体调用API函数的过程是什么(从用户级到系统级),还是采用了调用门么?

解决方案 »

  1.   

    winapi一般都是调用ntdll.dll中的 KiFastSystemCall ,里面就一句 sysenter ,由用户态切换到内核态
      

  2.   

    具体是怎么切换的呢,也就是 KiFastSystemCall 的大概实现过程是?
      

  3.   

    不是已经说了么,里面就一句sysenter,想具体了解就去看intel的手册,不知道win ddk里面有没有说
    反正我是没兴趣研究debug到内核态去
      

  4.   

    sysenter是指令,过程简单来说就几步
    有三个特殊的寄存器,sysenter_cs_msr,sysenter_cs_esp,sysenter_cs_eip,用来保存跳转之后的cs和esp内容,eip保存目标地址,设置eip相当于一个jmp
    1、装载cs_msr到cs寄存器
    2、装载eip_msr到eip寄存器
    3、装载cs_msr+8到ss寄存器
    4、装载esp_msr到esp寄存器
    5、跳到内核态
    6、eflags里面的VM标志被清除
    7、执行eip,R0例程