第12章 系统调用与API

系统调用是应用程序与操作系统内核之间的接口。

WindowsAPI是通过封装DLL堆系统调用实现的。

API和系统调用不是一回事,API最终是通过系统调用实现的。

12.1系统调用介绍

12.1.1什么是系统调用

操作系统是各种计算机资源的管理者,应用程序必须通过操作系统来访问资源,而不能跳过操作系统。

操作系统会提供接口供应用程序使用资源,这些接口是通过中断实现的,该接口就是API(Application

Program Interface)。

12.1.3系统调用的弊端

1、过于底层使用起来不能做到一目了然,需要额外的知识来辅助。

2、各个系统的系统调用不相同。

解决问题1的办法就是增加中间层,这个中间层就是运行库。但是运行库只能提供个操作系统之间都有的功能,也就是功能的交集,至于说操作系统特有的,就不提供了。

12.2系统调用原理

现代操作系统通常有两种特权级别用户模式和内核模式。顾名思义,用户代码运行在用户态,系统代码运行在内核模式。

高特权级代码运行在低特权级模式是允许的,反之,必须做到低特权级代码不破坏高特权级代码。

操作系统一般是通过中断从用户态切换到内核态的。

系统调用都有一个系统调用号位于系统调用表里。

12.2.2基于INT的Linux的经典系统调用实现

图12-3描绘了Linux系统中断流程。

在Linux下用户态和内核态使用的是不同的栈,当程序执行流从用户态切换到内核态时,栈也要做相应的切换,程序返回时还要切回来。

当前栈是指ESP所指的栈。

这一节还说明用户态和内核态的切换过程。

i386下Linux的系统调用对应的中断号是0x80。

Linux中内核里的系统调用函数往往是以sys开头的。

12.2.3

Linux的新型系统调用机制

基于int的系统调用机制适用于老机器,现在性能不行了。

Linux开始支持一组新的系统调用sysenter和sysexit,这些指令在虚拟动态共享库(Virtual

Dynamic Shared Library)之中。

12.3

Windows API

CRT是建立在Windows API之上的。

微软不让程序员直接调用Windows的API而是对Windows的API进行了封装并提供了封装后的接口给程序员使用,所以现在程序员一般使用的是不是真正的Windows

API。

封装以后的Windows

API叫做API层,程序员使用的就是API层的接口。

12.3.1

Windows API概览

它是以DLL导出函数的形式供程序员使用的,具体有很多东西,包括头文件、导出库、相关文件和工具,这些合起来叫Software

Development Kit(SDK)。

VS里面就有包含SDK的文件夹,里面包括了诸如Windows.h的头文件。

12.3.2为什么要使用Windows API?

直接使用API会造成在不同平台间的不兼容。

在软件结构中加中间层解决问题的方法叫做银弹。

你可能感兴趣的:(第12章 系统调用与API)