# 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 失效