程序员的自我修养(十六) -- 系统调用与API

系统调用

系统调用是应用程序(包括运行库)与操作系统内核之间的接口,它决定了应用程序是如何与内核打交道的。

为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都会提供一套接口,这些接口往往是通过中断来实现的。

Windows采用0x2E号中断作为系统调用入口
Linux采用0x80号中断作为系统调用的入口

系统调用支持的范围

  • 程序运行所必需的支持
  • 对系统资源的访问

缺点:

  • 使用不便
  • 各个操作系统之间不兼容
系统调用原理

1、 特权级与中断
特权级:用户模式与内核模式【也称为用户态与内核态】==》可以在不同模式上,以限制它们的权利,提高稳定性和安全性。
中断:一个硬件或软件发出的请求,要求CPU暂停当前工作转手去处理更加重要的事情。

用户态的程序通过中断来调用内核态的代码(比如系统调用)
中断一般有两个属性:中断号(从0开始)、中断处理程序(ISR)。【中断号和中断处理程序一一对应】
中断向量表:位于内核中,记录中断号与中断处理程序的对应关系
程序员的自我修养(十六) -- 系统调用与API
中断分类:

  • 硬件中断:硬件异常或其他事件发生【比如断电】
  • 软件中断:通常是一个指令

系统调用一般的步骤:
1、 触发中断
2、 切换堆栈
3、 中断处理程序
程序员的自我修养(十六) -- 系统调用与API

Windows API

Windows系统是完全基于DLL机制的,它通过DLL对系统调用进行了包装,形成了Windows API。

Windows API是指Windows操作系统提供给应用程序开发者最底层、最直接与Windows打交道的接口。在Windows操作系统下,CRT是建立在Windows API之上的。

Widows和Linux调用fwirte()的比较:
程序员的自我修养(十六) -- 系统调用与API