系统调用是应用程序与操作系统内核之间的接口。
WindowsAPI是通过封装DLL堆系统调用实现的。
API和系统调用不是一回事,API最终是通过系统调用实现的。
操作系统是各种计算机资源的管理者,应用程序必须通过操作系统来访问资源,而不能跳过操作系统。
操作系统会提供接口供应用程序使用资源,这些接口是通过中断实现的,该接口就是API(Application
Program Interface)。
1、过于底层使用起来不能做到一目了然,需要额外的知识来辅助。
2、各个系统的系统调用不相同。
解决问题1的办法就是增加中间层,这个中间层就是运行库。但是运行库只能提供个操作系统之间都有的功能,也就是功能的交集,至于说操作系统特有的,就不提供了。
现代操作系统通常有两种特权级别用户模式和内核模式。顾名思义,用户代码运行在用户态,系统代码运行在内核模式。
高特权级代码运行在低特权级模式是允许的,反之,必须做到低特权级代码不破坏高特权级代码。
操作系统一般是通过中断从用户态切换到内核态的。
系统调用都有一个系统调用号位于系统调用表里。
图12-3描绘了Linux系统中断流程。
在Linux下用户态和内核态使用的是不同的栈,当程序执行流从用户态切换到内核态时,栈也要做相应的切换,程序返回时还要切回来。
当前栈是指ESP所指的栈。
这一节还说明用户态和内核态的切换过程。
i386下Linux的系统调用对应的中断号是0x80。
Linux中内核里的系统调用函数往往是以sys开头的。
基于int的系统调用机制适用于老机器,现在性能不行了。
Linux开始支持一组新的系统调用sysenter和sysexit,这些指令在虚拟动态共享库(Virtual
Dynamic Shared Library)之中。
CRT是建立在Windows API之上的。
微软不让程序员直接调用Windows的API而是对Windows的API进行了封装并提供了封装后的接口给程序员使用,所以现在程序员一般使用的是不是真正的Windows
API。
封装以后的Windows
API叫做API层,程序员使用的就是API层的接口。
它是以DLL导出函数的形式供程序员使用的,具体有很多东西,包括头文件、导出库、相关文件和工具,这些合起来叫Software
Development Kit(SDK)。
VS里面就有包含SDK的文件夹,里面包括了诸如Windows.h的头文件。
直接使用API会造成在不同平台间的不兼容。
在软件结构中加中间层解决问题的方法叫做银弹。