背景
系统资源有限,不能被多个应用程序同事访问,所以操作系统将可能产生冲突的系统资源保护起来,阻止应用程序直接访问。
程序想访问受保护的系统资源时,使用的由操作系统提供的接口,称为系统调用。
系统调用
- 每个系统调用的含义,参数,行为都要有严格清晰的定义
- 稳定和向后兼容
操作系统的系统调用从开始定义后就基本不做改变,仅增加新的调用接口,保持向后兼容
- Windows 的系统调用实际上是 Windows API
Linux 常见的系统调用
- exit
- fork
- read
- write
- open
- close
- waitpid
- creat
系统调用的弊端
- 使用不便,系统调用接口过于原始,有很多操作系统的细节,没有包装
- 各个操作系统之间系统调用不兼容
- 使用运行库可以避免上面的问题,但是涉及图形交互时很难保持兼容性
系统调用原理
- 用户模式(用户态)
普通应用程序运行在用户态的模式下,一些系统的操作受限 - 内核模式(内核态)
系统调用时运行在内核态的
操作系统通过中断来从用户态切换从内核态
- 不同的中断具有不同的中断号
- 一个中断处理程序一一对应一个中断号
- 一个中断号对应多个系统调用
Windows API
应用程序编程接口,API 不是一个专门的事物,而是一系列事物的总称。Windows 下提到 API ,一般指 Windows 系统提供给应用程序的接口,即 Windows API。
简介
Windows 的最底层接口是 Windows API,也是 Windows 编程基础,尽管 Windows 内核提供了数百个系统调用,但并没有公开,只能通过调用 API 层的接口。
- Windows API 以 DLL 导出函数形式暴露给应用程序开发者的
- Windows.h 包含了 Windows API 的核心部分
- MSDN 里可以找到每个 API 的文档和示例,是学习 Win32 API 的最好工具
为什么要使用 Windows API
- 为了保持向后兼容,而在 CRT 和系统调用之间添加了 Windows API 层
- 隔离硬件结构不同而导致的程序兼容性问题