【编译、链接、装载十五】系统调用与API——printf源码分析
我们从程序如何链接、 如何使用运行库到运行库的实现机制, 层层挖掘和剖析, 现在已经到了用户层面与内核层面的界限了, 也就是常说的系统调用(System Call) 。系统调用是应用程序(运行库也是应用程序的一部分) 与操作系统内核之间的接口, 它决定了应用程序是如何与内核打交道的。 无论程序是直接进行系统调用, 还是通过运行库, 最终还是会到达系统调用这个层面上。Windows系统是完全基于DLL机制的, 它通过DLL对系统调用进行了包装, 形成了所谓的Windows API。 应用程序所能看到的Windows系统的最底层的接口就是Windows API
一、系统调用介绍
1、什么是系统调用
什么是系统调用在现代的操作系统里, 程序运行的时候, 本身是没有权利访问多少系统资源的。 由于系统有限的资源有可能被多个不同的应用程序同时访问,因此, 如果不加以保护, 那么各个应用程序难免产生冲突。 所以现代操作系统都将可能产生冲突的系统资源给保护起来, 阻止应用程序直接访问。 这些系统资源包括文件、 网络、 IO、 各种设备等。 举个例子, 无论在Windows下还是Linux下, 程序员都没有机会擅自去访问硬盘的某扇区上面的数据, 而必须通过文件系统; 也不能擅自修改任意文件, 所有的这些操作都必须经由操作系统所规定的方式来进行, 比如我们使用fopen去打开一个没有权限的文件就会发生失败。
为了让应用程序有能力访问系统资源, 也为了让程序借助操作系统做一些必须由操作系统支持的行为,