首页 > 系统相关 >Linux系统调用实现方式的演进

Linux系统调用实现方式的演进

时间:2023-02-22 12:34:27浏览次数:37  
标签:调用 演进 系统 指令 0x80 内核 Linux

系统调用是用于用户空间和内核空间之间接口的API,是用户程序与内核进行通信的一种方式,系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核核心态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。
glibc 是 Linux 下使用的开源的标准 C 库,通常情况,每个特定的系统调用对应了至少一个 glibc 封装的库函数。

INT 0x80软中断指令

早期的系统调用(在 2.6以前的 Linux 2.4 内核中)是通过汇编指令int(中断)来实现的,当用户态进程发出int $0x80指令时,CPU切换到内核态并开始执行system_call函数。
int表示中断,数字0x80是中断号,在Linux中,0x80对应的中断处理程序是内核,因此INT 0x80是用于在x86(即Intel兼容)处理器上的Linux中调用系统调用的汇编语言指令。
“iret”--中断返回指令

快速系统调用sysenter/sysexit指令

因为int指令要执行一致性和安全性检查。后来内核又改用了Intel提供的“快速系统调用”的sysenter指令(AMD SYSCALL)
sysenter 指令用于由 Ring3 进入 Ring0,SYSEXIT 指令用于由 Ring0 返回 Ring3。由于没有特权级别检查的处理,也没有压栈的操作,所以执行速度比 INT n/IRET 快了不少。
该指令经过了优化,它可以使将由用户代码(运行在Ring3层)向操作系统或执行程序(运行在Ring0层)发起的系统调用发挥最大的性能
sysenter和sysexit都是CPU原生支持的指令集

总结

需要明白的是,不管是以前的INT 0x80中断方式进入系统调用,还是使用sysenter方式进入系统调用,对于系统调用来说,最终都是通过"sys_call_table"来根据调用号寻址,跳转到对应的系统调用处理例程里面的。

标签:调用,演进,系统,指令,0x80,内核,Linux
From: https://www.cnblogs.com/imust2008/p/17134146.html

相关文章