应用程序调用printf(),会触发系统调用write()
1、概念
操作系统服务的编程接口,通常由高级语言编写(C/C++),程序访问通常是通过高层次的API接口而不是直接进行系统调用。
2、三种最常用的应用程序编程接口(API)
1、win32 API(windows)
2、POSIX API用于POSIX-base-system(包括UNIX、LINUX,MacOS X的所有版本)
3、Java API 用于JAVA虚拟机(JVM)
3、系统调用的实现
3.1每个系统调用对应一个系统调用号
系统调用接口根据系统调用号来维护表的索引
3.2系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
3.3用户不需要知道系统调用的实现
需要设置调用参数和获取返回结果
操作系统接口的细节大部分都隐藏在编程接口后
通过运行程序支持的库来管理
4、函数调用和系统调用的区别
系统调用:INT和IRET指令用于系统调用,系统调用时,用户态和内核态使用不同的堆栈所以存在堆栈切换和特权级的转换。(内核态才有特权)
函数调用:CALL和RET用于常规调用,常规调用时没有堆栈切换。
5、中断、异常和系统调用的开销
中断、异常和系统调用的开销都大于函数调用,主要牵涉用户态和内核态的切换,开销包括:引导机制、建立内核堆栈、验证参数、内核态映射到用户态的地址空间(更新页面映射权限)、内核态独立地址空间(TLB)