zoukankan      html  css  js  c++  java
  • SYSCALL

      SYSCALL在0环权限下调用一个OS系统调用的处理例程。它通过加载来自 IA32_LSTR MSR 来加载 RIP(之后保存syscall下一条指令的地址在rcx中)。(WRMSR指令确保 IA32_LSTAR MSR 总是包含一个合法的地址。)

      SYCALL也保存RFLAGS在R11,之后使用 IA32_FMASK MSR 来 mask RFLAGS(MSR地址C0000084H);特别的,处理器根据设置在IA32-FMASK MSR的位来清理RFLAGS每一位。

      SYSCALL加载CS和SS段选择子使用来自 IA32_START MSR 比特位47:32上的值。然而,这CS SS描述符的缓存并不会从描述符(在GDT或IDT)中加载。相反,这描述符缓存加载使用固定的值。详细细节看Operation节。操作系统负责确保段选择子对应的固定的描述符值(GDT或IDT)加载到描述符缓存中;这SYSCALL指令并不确保这种对应关系。

      SYSCALL指令并不会保存栈指针(RSP)。如果OS操作系统调用改变了栈指针,软件负责保存原来的栈指针。这可以在调用SYSCALL之前完成,软件恢复指针在SYSCALL下面的一条指令(在SYSRET执行后)。同样的,OS系统调用例程可能存储栈指针,并且在执行SYSRET前恢复它。

      指令顺序。SYSCALL指令之后的指令可能在更早的指令执行完成前从内存中获取,但是他们将不会被执行,直到所有在SYSCALL之前的指令全部执行完成。(后面的指令可能在前面指令存储的数据变为全局可见之前执行。)

    Operation

    IF(CS.L != 1) or (IA32_EFER.LMA != 1) or (IA32_EFER.SEC != 1)

    (* Not in 64-Bit Mode or SYSCALL / SYSRET not enabled in IA32_EFER*)

      THEN #UD;

    FI;

    RCX <- RIP (* WILL Conatin address of next instruction*)

    RIPP <- IA32_LSTR;

    R11 <- RFLAGS;

    RFLAGS <- RELFAGS AND NOT (IA32_FMASK);

    CS.Selector <- IA32_STAR[47:32] AND FFFCH(* Operating System provides CS; RPL forced to 0 *)

    (* Set rest of CS to a fixed value)

    CS.Base <- 0; (* Flag Segment*)

    CS.Limit <- FFFFFH; (* With 4-KByte granularity, implies a 4-GByte limit*)

    CS.Type <- 11;  (*Execute/Read code.accessed*)

    CS.S <- 1;

    CS.DPL <- 0;

    CS.P <- 1;

    CS.L <- 1; (*Entry is to 64-bit mode*)

    CS.D <- 0; (*Required if CS.L = 1*)

    CS.G <- 1; (*4-KByte Granuity*)

    CPL <- 0;

    SS.Selector <- IA32_STAR[47:32] + 8; (*SS just above CS*)

    (*set rest of SS to a fixed value*)

    SS.Base <- 0; (Flat segment)

    SS.Limit <- FFFFFH; (*With 4-KByte granularity,implies a 4-GByte limit*);

    SS.Type <- 3; (*Read/Write data,accessed*)

    SS.S <- 1;

    SS.DPL <- 0;

    SS.P <- 1;

    SS.B <- 1;  (*32-bit stack segement*)

    SS.G <- 1;  (* 4-KByte granularity *)

     

    Other Mode Exceptions

    #UD The SYSCALL instruction is not recognized in protected Mode

    64-Bit Mode Exceptions

    #UD  if IA32_EFER.SEC = 0.

        if the LOCK prefix is used.

    个人阅读体会:

      SYSCALL 是在64位保护模式,0权限时才允许被调用的,其值存储在 IA32_LSTR 中。

      另外有些需要注意的地方,比如CS与SS中的有些位是强制固定的(如上面描述的一样),其CS存储在 IA32_STAR[47:32],而SS直接是该位置+8;

      另外SYSCALL进入之后的现象RCX存储返回值,R11存储RFLAGS值,其RLAGS之后与 IA32_FMASK 作 AND NOT运算。

      

      其"RCX中的值"之后可能与SYSRET指令返回有关,我们可以从我们的代码中观察到RCX存储的该值的现象,我们之后再来分析。

  • 相关阅读:
    【CF103D】Time to Raid Cowavans-分块+离线处理
    【BZOJ3992】序列统计(SDOI2015)-NTT+循环卷积+快速幂
    【BZOJ3527】力(ZJOI2014)-FFT
    【HDU4609】3-idiots-FFT+生成函数
    【LuoguP3803】多项式乘法-FFT/NTT模板题(附带FFT/NTT简单介绍)
    网络流24题解题总结(更新中)
    【BZOJ3531】旅行(SDOI2014)-树链剖分+动态加点线段树
    [Noip2012]借教室
    bzoj3394:[Usaco2009 Jan]Best Spot 最佳牧场
    [NOIP2014]无线网站发射器选址
  • 原文地址:https://www.cnblogs.com/onetrainee/p/13509100.html
Copyright © 2011-2022 走看看