# Intel 指令 - intel 64位使用 SYSENTER 和 SYSEXIT 指令 - 即 Fast System Call 和 Fast Return from Fast System Call - 来源:Intel® 64 and IA-32 Architectures Software Developer’s Manual Vol. 2B 4-690 ## SYSENTER - 用于快速实现系统调用: ```mermaid flowchart LR user["用户代码 (运行在 privilage level 3)"] os["操作系统执行调用 (运行在 privilage level 0)"] user -- system call --> os ``` - 在执行 SYSENTER 指令之前,必须先通过写入 MSRs 来指定 privilege level 0 的: - code segment(通过 IA32_SYSENTER_CS MSR) - code entry point(通过 IA32_SYSENTER_EIP MSR) - stack segment(也是通过 IA32_SYSENTER_CS MSR) - stack pointer(通过 IA32_SYSENTER_ESP MSR) - 传参 - eax:syscall number - 其他参数也使用寄存器传递 1. 发起系统调用前将参数写入 CPU 寄存器 2. kernel 将参数从寄存器拷贝到 kernel stack ## SYSEXIT - 快速返回到 privilege level 3 user code。 - 在执行前,需要先设置用户代码的 CS,IP 和 SS, SP(通过 MSR 和 寄存器) - IA32_SYSENTER_CS:设置 CS 和 SS - RDX:设置 user code RIP - ECX:设置 user code RSP ------- # 开销 - 空间切换: - 代码和栈空间在 user 和 os 之间切换 ```mermaid flowchart LR user1["user"] user1 -- SYSENTER --> os os user2["user"] os -- SYSEXIT --> user2 ``` - 寄存器保存和恢复(与函数调用类似) - 查找 system call handler - 校验 - 参数校验,地址是否在进程地址空间内(`access_ok()`) - 数据拷贝(调用参数和返回值) - 切换带来的 cache 失效