首页
社区
课程
招聘
[分享]SYSENTER / SYSEXIT
发表于: 2011-2-17 21:21 7275

[分享]SYSENTER / SYSEXIT

2011-2-17 21:21
7275
把学院的资料找找,左加加,右加加,再加上自己的理解...有错还请纠正......
英文也是学院大牛翻的....Intel 卷3-4.8.7 SYSENTER/SYSEXIT
GDT表也是学院大牛逆来的............

=========================================================

Sysenter/Sysexit
The SYSENTER and SYSEXIT instructions were introduced into the IA-32 architecture
in the Pentium II processors for the purpose of providing a fast (low overhead)
mechanism for calling operating system or executive procedures. The SYSENTER
instruction is intended for use by user code running at privilege level 3 to access
operating system or executive procedures running at privilege level 0. The SYSEXIT
procedure is intended for use by privilege level 0 operating system or executive
procedures for fast returns to privilege level 3 user code. The SYSENTER instruction
can be executed from privilege levels 3, 2, or 1; the SYSEXIT instruction can only be
executed from privilege level 0.

SYENTER和SYSEXIT指令首次出现于Pentium II处理器中,其目的是为了提供一个快速(低负载)
的调用操作系统或者执行体过程的机制.SYSENTER用于运行特权级别为3的用户访问运行于特权
级别为0操作系统或者执行体过程..SYSEXIT用于特权级别为0的操作系统或者执行体过程快速返
回到特权级别为3的用户代码.SYSENTER能够在特权级别3,2,1,或者0中执行;而SYSEXIT只能
够在特权级别0中执行.

The SYSENTER and SYSEXIT instructions are companion instructions, but they do not
constitute a call/return pair because the SYSENTER instruction does not save any
state information for use by the SYSEXIT instruction on a return.

SYSENTER和SYSEXIT指令是一对指令,但是它们却不能用来构建一个调用/返回对.这是因为
SYSENTER并不保存任何可以供SYSEXIT返回的状态信息.

The target instruction and stack pointer for these instructions are not specified
through instruction operands. Instead, they are specified through parameters
entered in several MSRs and general-purpose registers. For the SYSENTER instruction,
the processor gets the privilege level 0 target instruction and stack pointer from
the following sources:

这些指令的目标指令和堆栈指针并不通过指令操作数来指定.它们是通过MSRs和一般目的
寄存器中的参数来指定的.构成SYSENTER的目标域的来源可以分为如下几种:

. Target code segment  -  Reads it from the SYSENTER_CS_MSR.
. Target instruction   -  Reads it from the SYSENTER_EIP_MSR.
. Stack segment        -  Computes it adding 8 to the value in the SYSENTER_CS_MSR.
. Stack pointer        -  Reads it from the SYSENTER_ESP_MSR.

. 目标代码段   - 从 SYSENTER_CS_MSR 中读取.   Sel_0=1 低 16 位
        . CS的新属性- CS 基址= 0, CS 限制= FFFF FFFFH.
. 目标指令     - 从 SYSENTER_EIP_MSR 中读取.
. 堆栈段       - 由 SYSENTER_CS_MSR加8 得到.  Sel_0+8=2 GDT中下一个选择子
. 堆栈指针     - 从 SYSENTER_ESP_MSR 中读取.       8 Word = 一个GDT描述符
        . SS的新属性- SS 基址= 0, SS 限制= FFFF FFFFH.

MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址如下表。这些地址值在以后的
intel 64和IA32处理器中是固定不变的。
SYSENTER_CS_MSR  : Ke386Wrmsr(0x174, KGDT_R0_CODE,                        0);
SYSENTER_ESP_MSR : Ke386Wrmsr(0x175, (ULONG)KeGetCurrentPrcb->DpcStack,   0);
SYSENTER_EIP_MSR : Ke386Wrmsr(0x176, (ULONG)KiFastCallEntry,              0);

                  MSR               地址
            SYSENTER_CS_MSR         174H
            SYSENTER_ESP_MSR        175H
            SYSENTER_EIP_MSR        176H

lkd> rdmsr 174
                msr[174] = 00000000`00000008
lkd> rdmsr 175
                msr[175] = 00000000`f7bea000
lkd> rdmsr 176
                msr[176] = 00000000`804df6f0
lkd> ln 804df6f0
(804df6f0)   nt!KiFastCallEntry   |  (804df7fd)   nt!KiServiceExit

//    GDTbase=80036000 Limit=03FF
//
//    Sel.    Type    Base        Limit       DPL     Attributes
//    0008    Code32  00000000    FFFFFFFF    0       P RE  ====> SYSENTER_CS_MSR
//    0010    Data32  00000000    FFFFFFFF    0       P RW  ====> SYSENTER_CS_MSR + 8
//    001B    Code32  00000000    FFFFFFFF    3       P RE  ====> SYSENTER_CS_MSR +16
//    0023    Data32  00000000    FFFFFFFF    3       P RW  ====> SYSENTER_CS_MSR +24
//    0028    TSS32   8024D000    000020AB    0       P B
//    0030    Data32  FFDFF000    00001FFF    0       P RW  ====>   R0:fs ==> KPCR
//    003B    Data32  7FFD9000    00000FFF    3       P RW  ====>   R3:fs
//    0043    Data16  00000400    0000FFFF    3       P RW
//                               DPL  RPL
//                FEDCBA9876543   2   10     =====>   段选择子
//                        00110   0   00     =====>   0x30

For the SYSEXIT instruction, the privilege level 3 target instruction and stack
pointer are specified as follows:

构成SYSEXIT的目标域的来源可以分为如下几种:

. Target code segment  -  Computes it by adding 16 to the value in the
                            SYSENTER_CS_MSR.
. Target instruction   -  Reads it from the EDX register.
. Stack segment        -  Computes it by adding 24 to the value in the
                            SYSENTER_CS_MSR.
. Stack pointer        -  Reads it from the ECX register.

. 目标代码段   - 由SYSENTER_CS_MSR加上16得到.      Sel_0+16=3
. 目标指令     - 从EDX中读取.
. 堆栈段       - 由SYSENTER_CS_MSR加上24计算得到.  Sel_0+24=4
. 堆栈指针     - 从ECX读取.

The SYSENTER and SYSEXIT instructions preform “fast” calls and returns because
they force the processor into a predefined privilege level 0 state when a SYSENTER
instruction is executed and into a predefined privilege level 3 state when a SYSEXIT
instruction is executed. By forcing predefined and consistent processor states, the
number of privilege checks ordinarily required to perform a far call to another
privilege levels are greatly reduced. Also, by predefining the target context state
in MSRs and general-purpose registers eliminates all memory accesses except when
fetching the target code.

SYSENTER和SYSEXIT指令能够进行"快速"调用和返回,因为SYSENTER能够强制处理器进入
一个预定义的特权级别为0的状态而SYSEXIT即能够强制其进入一个预定义的特权级别
为3的状态.通过强制使用预定义稳定的处理器状态,要特权级别间远程调用的需要进行的
特权检查的次数将大为减少.同时,通过预先在MSRs和一般目的寄存器中定义目标上下文状态
也就剔除读取目标代码时的内存访问需要.

Any additional state that needs to be saved to allow a return to the calling
procedure must be saved explicitly by the calling procedure or be predefined through
programming conventions.

任何返回调用过程需要保存的状态必须在调用过程中明确保存或者通过程序习惯来预定义.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 21
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在 Ring3 的代码调用了 sysenter 指令之后,CPU 会做出如下的操作:

1. 将 SYSENTER_CS_MSR 的值装载到 cs 寄存器

2. 将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器

3. 将 SYSENTER_CS_MSR 的值加 8(Ring0 的堆栈段描述符)装载到 ss 寄存器。

4. 将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器

5. 将特权级切换到 Ring0

6. 如果 EFLAGS 寄存器的 VM 标志被置位,则清除该标志

7. 开始执行指定的 Ring0 代码

在 Ring0 代码执行完毕,调用 SYSEXIT 指令退回 Ring3 时,CPU 会做出如下操作:

1. 将 SYSENTER_CS_MSR 的值加 16(Ring3 的代码段描述符)装载到 cs 寄存器

2. 将寄存器 edx 的值装载到 eip 寄存器

3. 将 SYSENTER_CS_MSR 的值加 24(Ring3 的堆栈段描述符)装载到 ss 寄存器

4. 将寄存器 ecx 的值装载到 esp 寄存器

5. 将特权级切换到 Ring3

6. 继续执行 Ring3 的代码

这个送给LZ,你上面翻译的别人估计难以看懂..直观点看这个.
2011-2-17 22:31
0
雪    币: 290
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
我想确定一下 GDT 的前 4 个是不是 SYSENTER / SYSEXIT..........
2011-2-17 22:44
0
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很好,我明白了。
2011-2-18 11:26
0
游客
登录 | 注册 方可回帖
返回
//