程序员的自我修养(十六) -- 系统调用与API
系统调用
系统调用是应用程序(包括运行库)与操作系统内核之间的接口,它决定了应用程序是如何与内核打交道的。
为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都会提供一套接口,这些接口往往是通过中断来实现的。
Windows采用0x2E号中断作为系统调用入口
Linux采用0x80号中断作为系统调用的入口
系统调用支持的范围
- 程序运行所必需的支持
- 对系统资源的访问
缺点:
- 使用不便
- 各个操作系统之间不兼容
系统调用原理
1、 特权级与中断
特权级:用户模式与内核模式【也称为用户态与内核态】==》可以在不同模式上,以限制它们的权利,提高稳定性和安全性。
中断:一个硬件或软件发出的请求,要求CPU暂停当前工作转手去处理更加重要的事情。
用户态的程序通过中断来调用内核态的代码(比如系统调用)
中断一般有两个属性:中断号(从0开始)、中断处理程序(ISR)。【中断号和中断处理程序一一对应】
中断向量表:位于内核中,记录中断号与中断处理程序的对应关系
中断分类:
- 硬件中断:硬件异常或其他事件发生【比如断电】
- 软件中断:通常是一个指令
系统调用一般的步骤:
1、 触发中断
2、 切换堆栈
3、 中断处理程序
Windows API
Windows系统是完全基于DLL机制的,它通过DLL对系统调用进行了包装,形成了Windows API。
Windows API是指Windows操作系统提供给应用程序开发者最底层、最直接与Windows打交道的接口。在Windows操作系统下,CRT是建立在Windows API之上的。
Widows和Linux调用fwirte()的比较: