*昨天总结了main函数前世今生的问题,跟着源码一步步看。。。今天来看看系统调用是什么。。。→_→*
系统调用(System Call)是应用程序与操作系统与内核之间的接口
系统调用(System Call)的定义
现代操作系统将可能产生冲突的系统资源(包括文件、I/O等设备)保护起来,阻止应用程序直接访问
为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都提供一套接口,以供应用程序使用
这些接口往往通过中断实现,比如Linux使用0x80号端口作为系统调用的入口,Windows采用0x2E号中断作为系统调用入口
系统调用的弊端
使用不便:操作系统提供的系统调用接口过于原始,没有进行很好的包装,使用起来不方便
各个操作系统之间调用不兼容
解决方法:运行库作为系统调用与程序之间的抽象层,可以简化使用,统一形式
运行时库将不同的操作系统的系统调用包装成统一固定的接口,使得同样的代码在不同的操作系统下都可以直接编译并产生一致的效果,即源代码级别上的可移植性
系统调用的原理
现代操作系统中通常有两种特权级别:用户态(User Mode)和内核态(Kernel Mode)。操作系统根据不同的特权,使不同的代码运行在不同的模式上以限制其权利,提高稳定性和安全性
系统调用是运行在内核态的,而应用程序基本都是运行在用户态的
操作系统一般通过中断(Interrupt)来从用户态切换到内核态
中断是一个硬件或软件发出的请求,要求CPU暂停当前的工作转手去处理更重要的事情。中断一般具有两个属性,一个称为中断号(从0开始),一个称为中断处理程序(Interrupt Service Routine, ISR)。不同的中断具有不同的中断号,而中断处理程序又与中断号一一对应。在内核中,有一个数组称为中断向量表(Interrupt Vector Table),这个数组的第n项包含了指向第n号中断的中断处理程序指针。
当中断到来时,CPU会暂停执行当前执行的代码,根据中断的中断号,在中断向量表中找到对应的中断处理程序,并调用它。中断处理程序执行完成之后,CPU会继续执行之前的代码
Linux系统调用流程
在x86下,系统调用由0x80中断完成,各个通用寄存器用于传递参数,EAX寄存器用于表示系统调用的接口号。当系统调用返回时,EAX寄存器又作为调用结果的返回值
每个系统调用都对应于内核源代码中的一个函数,他们都以“sys_”开头。(定义路径:linux-2.4.0\include\as