SYSENTER用来快速调用一个0层的系统过程。SYSENTER是SYSEXIT的同伴指令。该指令经过了优化,它可以使将由用户代码(运行在3层)向操作系统或执行程序(运行在0层)发起的系统调用发挥最大的性能。

在调用SYSENTER指令前,软件必须通过下面的MSR寄存器,指定0层的代码段和代码指针,0层的堆栈段和堆栈指针:

1.       IA32_SYSENTER_CS:一个32位值。低16位是0层的代码段的选择子。该值同时用来计算0层的堆栈的选择子。

2.       IA32_SYSENTER_EIP:包含一个32位的0层的代码指针,指向第一条指令。

3.       IA32_SYSENTER_ESP:包含一个32位的0层的堆栈指针。

MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址如下表。这些地址值在以后的intel 64和IA32处理器中是固定不变的。

MSR

地址

IA32_SYSENTER_CS

174H

IA32_SYSENTER_ESP

175H

IA32_SYSENTER_EIP

176H

当执行SYSENTER,处理器会做下面的动作:

1.       从IA32_SYSENTER_CS从取出段选择子加载到CS中。

2.       从IA32_SYSENTER_EIP取出指令指针放到EIP中

3.       将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。

4.       从IA32_SYSENTER_ESP取出堆栈指针放到ESP寄存器中

5.       切换到0层。

6.       若EFLAGS中VM标志已被置,则清除VM标志。

7.       开始执行选择的系统过程。

处理器不保存返回地址和调用过程的其他状态信息。

SYSENTER指令总是转移到DPL为0的保护模式下的代码段。这条指令需要操作系统首先满足下面的条件:

1.       选择的系统代码段必须是一个平坦的、32位最大为4G的代码段。此段必须是可执行的、可读、已存取、非一致的。

2.       选择的系统堆栈段必须是一个平坦的、32位最大为4G的数据段。此段必须可读写、已存取、可向上扩展。

SYSENTER可在除实地址模式外所有其他模式下执行。

SYSENTER和SYSEXIT是同伴指令,但是它们并不像CALL/RET指令对。当执行SYSENTER时,处理器并不会为用户代码保存状态信息。而且无论是SYSENTER还是SYSEXIT都不能通过堆栈传递参数。

为了能通过SYSENTER/SYSEXIT指令,使控制在3层用户代码和0层操作系统代码之间相互转移,必须满足下面的条件:

1.       0层的代码段和0层堆栈段段以及3层的代码段和3层堆栈段在GDT中必须连续。这样就可以使处理器能从从SYSENTER_CS_MSR的值计算出其他的选择子的值了。

2.       .若要返回调用过程,由用户代码执行的快速系统调用“桩”(STUB)例程(通常在共享库或DLL中)必须保存返回地址以及处理器的状态信息;当要返回至用户代码时,操作系统或者由SYSENTER调用的执行程序必须使用这些保存的地址和状态信息。

SYSENTER和SYSEXIT指令是从Pentium II开始新加入到IA32位架构中来的。这两个指令在处理器上是否有效要看CPUID指令返回的EDX寄存器中SEP标记(SYSENTER/SYSEXIT存在标记)是否置上。操作系统若要检查SEP标记必须要同时检查处理器族(family)和型号(model),这样才能确保结果的准确性。例如:

IF (CPUID SEP bit is set)

IF (Family == 6) AND (Model < 3) AND (Stepping < 3)

THEN

Fast System Call NOT supported

FI;

ELSE Fast System Call is supported

FI

当CPUID指令在Penitum Pro(Model 1)上执行,虽然返回的SEP标志是置上的,但该处理器还是不支持SYSENTER/SYSEXIT指令的。

SYSENTER——快速系统调用相关推荐

  1. SYSENTER、SYSEXIT—快速系统调用

    SYSENTER用来快速调用一个0层的系统过程.SYSENTER是SYSEXIT的同伴指令.该指令经过了优化,它可以使将由用户代码(运行在3层)向操作系统或执行程序(运行在0层)发起的系统调用发挥最大 ...

  2. fast system call 快速系统调用

    SYSENTER用来快速调用一个0层的系统过程.SYSENTER是SYSEXIT的同伴指令.该指令经过了优化,它可以使将由用户代码(运行在3层)向操作系统或执行程序(运行在0层)发起的系统调用发挥最大 ...

  3. 用户态程序调用系统态程序-快速系统调用

    在调试程序中,经常发现程序最后会调用到系统态的程序.这个过程是怎样的?用户空间的程序怎样进行系统调用,在此过程中是怎样进入和退出内核的. 根据运行状态和执行代码所在的内存空间的不同,CPU既可以运行于 ...

  4. Linux 2.6中基于Sysenter的系统调用机制

    https://articles.manugarg.com/systemcallinlinux2_6.html 目录 1. 什么是系统调用? 2. 系统调用中发生了什么? 3. 很好的老方法 4. 新 ...

  5. PWN学习资料整理——(二)基础

    在PWN中,永远离不开汇编,包括汇编指令,寄存器等 目录 1. 大小端模式 大端模式 小端模式 2. 寄存器 通用寄存器 标志寄存器 段寄存器 3. 内存 4. 堆栈 5. 函数调用约定 x86下函数 ...

  6. 使用 SYSENTER 和 SYSEXIT 指令执行对系统过程的快速调用

    SYSENTER 和 SYSEXIT 指令被引入奔腾 II 处理器的 IA-32 体系结构中,目的是为调用操作系统或执行程序提供一种快速(低开销)机制. SYSENTER 供以权限级别 3 运行的用户 ...

  7. 为什么 Linux 系统调用会消耗较多资源

    本文转载自:公众号真没什么逻辑,作者Draveness,特此感谢! 系统调用是计算机程序在执行的过程中向操作系统内核申请服务的方法,这可能包含硬件相关的服务.新进程的创建和执行以及进程调度,对操作系统 ...

  8. 实验四:汇编代码调用系统调用的工作过程

    钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 工作过程 以41 ...

  9. sysenter Hook

    SYSENTER是一条汇编指令,它是在Pentium® II 处理器及以上处理器中提供的,是快速系统调用的一部分.SYSENTER/SYSEXIT这对指令专门用于实现快速调用.在这之前是采用INT 0 ...

最新文章

  1. 深度解读:人体防御病毒的免疫力究竟是什么?
  2. Order笔记-数据库创建
  3. MediaPlayer loading 问题解决
  4. 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS
  5. 【企业管理】怎么把战略和规划转化为实际行动
  6. Docker 三剑客
  7. Hystrix面试 - 深入 Hystrix 执行时内部原理
  8. 面向程序员编程——精研排序算法
  9. python绘制国际象棋规则口诀_用Python编写一个国际象棋AI程序
  10. Three.js – Building a Cube with different mater...
  11. 问题:安卓手机插入OTG摄像头时,如何禁用摄像头自带的MIC?
  12. python int转换为byte_Python int与byte类型相互转化
  13. revit二次开发概念_半天入门Revit二次开发
  14. 揭开迷雾,来一顿美味的Capsule盛宴
  15. 2010年中国十大网络电视排行榜(转)
  16. Linux下护眼软件
  17. VoIP技术应用中存在的问题的分析研究
  18. 城头土命适合做计算机电脑职业,土命人适合的职业
  19. oracle 8002,ORACLE 8.1.7 数据库ORA-600 4194故障恢复
  20. 参加科学教师与计算机培训总结,小学科学教师培训总结

热门文章

  1. 成功企业的核心思维逻辑
  2. [汇编与C语言关系]2. main函数与启动例程
  3. s5pv210运行裸机程序的方法之在SDRAM(DDR2)中运行
  4. 常见的浏览器兼容问题
  5. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
  6. [原]消耗CPU资源的shell脚本
  7. 齐聚上海,get多媒体开发新技能(内附讲师资料下载)
  8. R语言学习笔记:向量
  9. Solaris底下配置samba
  10. 手势识别之平移、缩放、长按、旋转、滑动