程序员自我修养》系统调用与API

在这里插入图片描述
什么是系统调用
在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的。由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突。所以现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。这些系统资源包括文件、络、IO、各种设备等。

为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都会提供一套接口,以供应用程序使用这些接口往往通过中断来实现,比如 Linux使用0x80号中断作为系统调用的入口, Windows采用0x2E号中断作为系统调用入口。

系统调用既然作为一个接口,而且是非常重要的接口,它的定义将十分重要。因为所有的应用程序都依赖于系统调用,那么,首先系统调用必须有明确的定义,即每个调用的含义、参数、行为都需要有严格而清晰的定义,这样应用程序(运行库)才可以正确地使用它其次它必须保持稳定和向后兼容,如果某次系统更新导致系统调用接口发生改变,新的系统调用接口与之前版本完全不同,这是无法想象的,因为所有之前能正常运行的程序都将无法使用。所以操作系统的系统调用往往从一开始定义后就基本不做改变,而仅仅是增加新的调用接口,以保持向后兼容。

不过对于 Windows来讲,系统调用实际上不是它与应用程序的最终接口,而是API,所以上面这段对系统调用的描述同样适用于 Windows API,我们也暂时可以把API与系统调用等同起来。

系统调用的弊端
事实上,包括 Linux,大部分操作系统的系统调用都有两个特点:
1. 使用不便。操作系统提供的系统调用接口往往过于原始,程序员须要了解很多与操作系统相关的细节。如果没有进行很好的包装,使用起来不方便。
2. 各个操作系统之间系统调用不兼容。首先 Windows系统和 Linux系统之间的系统调用就基本上完全不同,虽然它们的内容很多都一样,但是定义和实现大不一样。即使是同系列的操作系统的系统调用都不一样,比如 Linux和UN就不相同
为了解决这个问题,“解决计算机的问题可以通过增加层来实现”,于是运行库挺身而出,它作为系统调用与程序之间的一个抽象层可以保持着这样的特点:
1. 使用简便。因为运行库本身就是语言级别的,它一般都设计相对比较友好。
2. 形式统一。运行库有它的标准,叫做标准库,凡是所有遵循这个标准的运行库理论上都是相互兼容的,不会随着操作系统或编译器的变化而变化。

系统调用原理:
系统调用是运行在内核态的,而应用程序基本都是运行在用户态的。用户态的程序如何运行内核态的代码呢?操作系统一般是通过中断( Interrupt)来从用户态切换到内核态。
由于中断号是很有限的,操作系统不会舍得用一个中断号来对应一个系统调用,而更倾向于用一个或少数几个中断号来对应所有的系统调用。例如,i386下 Windows里绝大多数系统调用都是由int0x2e来触发的,而 Linux则使用int0x80来触发所有的系统调用。

Windows APl
AP的全称为 Application Programming Interface,即应用程序编程接口,因此API不是一个专门的事物,而是一系列事物的总称。但是我们通常在 Windows下提到API时,一般就是指 Windows系统提供给应用程序的接口,即 Windows API, Windows API是指 Windows操作系统提供给应用程序开发者的最底层的、最直接与Windows打交道的接口。在 Windows操作系统下,CRT是建立在 Windows API之上的。很多操作系统是以系统调用作为应用程序最底层的,而 windows的最底层接口是 Windows API. Windows API是 Windows编程的基础.

Windows API是以DLL导出函数的形式暴露给应用程序开发者的。它被包含在诸多的系统DLL内,规模上非常庞大。微软把这些 Windows API DLL导出函数的声明的头文件、导出库、相关文件和工具一起提供给开发者,并让它们成为 Software Developmen Kit(SDK)。
在这里插入图片描述
《程序员自我修养》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值