系统调用

标准C库的例子

  • 应用程序调用printf()时,会触发系统调用write()。

系统调用

  • 操作系统服务的编程接口
  • 通常由高级语言编写(C或C++)
  • 程序访问通常是通过高层次的API接口而不是直接进行系统调用
  • 三种最常用的应用程序编程接口(API)
    • Win32 API用于Windows
    • POSIX API用于POSIX-based systems(包括UNIX, LINUX, Mac OS X的所有版本)
    • Java API用于JAVA虚拟机(JVM)

系统调用的实现

  • 每个系统调用对应一个系统调用号
    • 系统调用接口根据系统调用号来维护表的索引
  • 系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
  • 用户不需要知道系统调用实现
    • 需要设置调用参数和获取返回结果
    • 操作系统接口的细节大部分都隐藏在应用编程接口后
      • 通过运行程序支持的库来管理

函数调用和系统调用的不同处

  • 系统调用
    • INT和IRET指令用于系统调用
      • 系统调用时,堆栈切换和特权级的转换
  • 函数调用
    • CALL和RET用于常规调用
      • 常规调用时没有堆栈切换
  • Intel 64 and IA-32 Architecture Software Developer

中断、异常和系统调用的开销

  • 超过函数调用
  • 中断、异常和系统调用
    • 引导机制
    • 建立内核堆栈
    • 验证参数
    • 内核态映射到用户态地址空间
      • 跟新页面映射权限
    • 内核态独立地址空间
      • TLB