SYSENTER和SYSEXIT

本文详细解析了SYSENTER和SYSEXIT两条关键汇编指令的工作原理及执行流程,阐述了它们如何在不同特权级间进行系统调用,以及在系统内核与用户代码间切换的具体步骤。

SYSENTER和SYSEXIT

汇编指令sysenter 和sysexit这两条新汇编的解释

SYSENTER/SYSEXIT指令

SYSENTER、SYSEXIT—快速系统调用 - 爱生活,爱编程 - 博客园

SYSENTETR:特权级3用户代码“进入”特权级0的系统内核代码;可以从321特权级调用

SYSEXIT:特权级0的系统内核代码”进入“特权级3用户代码;只能从特权级0调用

执行SYSENTER和SYSEXIT的过程

调用SYSENTER指令前

在调用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处理器中是固定不变的。

执行SYSENTER

当执行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.   开始执行选择的系统过程。
    

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

调用SYSEXIT指令前

  1. 设置EDX为ring3下要执行的指令的首地址。

  2. 设置ECX为ring3下的栈指针。

执行SYSEXIT

  1. 将IA32_SYSENTER_CS + 16保存到CS中。(ring3下代码段)

  2. 将EDX赋值给EIP

  3. 将IA32_SYSENTER_CS + 24保存到SS中。

  4. 将ECX赋值给ESP。

  5. 切换到ring3下继续执行ring3代码。

yangyang@amd24:~/app/byte-unixbench/UnixBench$ ./Run -c 1 dhry2reg make all make[1]: 进入目录“/home/yangyang/app/byte-unixbench/UnixBench” make distr make[2]: 进入目录“/home/yangyang/app/byte-unixbench/UnixBench” Checking distribution of files ./pgms exists ./src exists ./testdir exists ./tmp exists ./results exists make[2]: 离开目录“/home/yangyang/app/byte-unixbench/UnixBench” make programs make[2]: 进入目录“/home/yangyang/app/byte-unixbench/UnixBench” make[2]: 对“programs”无需做任何事。 make[2]: 离开目录“/home/yangyang/app/byte-unixbench/UnixBench” make[1]: 离开目录“/home/yangyang/app/byte-unixbench/UnixBench” sh: 1: 3dinfo: not found # # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 6.0.0 Based on the Byte Magazine Unix Benchmark Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA May 21, 2025 johantheghost at yahoo period com ------------------------------------------------------------------------------ Use directories for: * File I/O tests (named fs***) = /home/yangyang/app/byte-unixbench/UnixBench/tmp * Results = /home/yangyang/app/byte-unixbench/UnixBench/results ------------------------------------------------------------------------------ Wide character in print at ./Run line 1811. Wide character in printf at ./Run line 1842. 1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 Use of uninitialized value in division (/) at ./Run line 1281. Wide character in printf at ./Run line 1742. ======================================================================== BYTE UNIX Benchmarks (Version 6.0.0) System: amd24: GNU/Linux OS: GNU/Linux -- 6.8.0-78-generic -- #78~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Aug 13 14:32:06 UTC 2 Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 1: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 2: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 3: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 4: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 5: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 6: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 7: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 8: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 9: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 10: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 11: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 12: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 13: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 14: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 15: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 16: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 17: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 18: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 19: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 20: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 21: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 22: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 23: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 24: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 25: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 26: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 27: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 28: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 29: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 30: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET CPU 31: AMD Ryzen 9 7950X 16-Core Processor (8982.2 bogomips) Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET 11:05:00 up 14 days, 19:30, 1 user, load average: 0.00, 0.04, 0.08; runlevel 2025-09-02 ------------------------------------------------------------------------ Benchmark Run: 三 9月 17 2025 11:05:00 - 11:07:10 32 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 0.1 lps (10.0 s, 7 samples) System Benchmarks Partial Index BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 0.1 0.0 ======== System Benchmarks Index Score (Partial Only) 10.0
最新发布
09-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值