应用程序主动向操作系统发出的服务请求
需要硬件和软件结合处理,其中 硬件需要完成的部分: 1. 在CPU初始化时设置中断使能标志 2. 依据内部或外部事件设置中断标志 3. 依据中断向量调用响应中断服务例程 软件需要完成: 1. 现场保护(编译器) 2. 中断服务处理(服务例程) 3. 清除中断服务标记(服务例程) 4. 现场恢复(编译器)
首先看一个函数调用,当用 C 想调用 printf 时,从用户态到内核态是怎样的实现机制。
下面再看下系统调用,操作系统服务的编程接口通常由高级语言编写,比如C和C++,程序访问通常是通过高层次的API接口而不是直接进行系统的调用。三种最常用的应用程序编程接口(API) 1. Win32 API用于Windows 2. POSIX API 用于POSIX-based systems(Unix, Linux, Mac OS X的所有版本) 3. Java API 用于JAVA虚拟机(JVM)
虽然系统调用相比函数调用更安全,但是前者的开销更大,具体表现在: 1. 引导机制 2. 建立内核堆栈 3. 验证参数 4. 内核态映射到用户态的地址空间,比如更新页面映射权限 5. 内核态独立地址空间,TLB