系统调用与库函数
定义
系统调用——应用程序与操作系统内核之间的接口。
库函数——将不同操作系统的系统调用包装为统一的固定接口,使得同样的代码,在不同的操作系统
下都可以直接编译,并产生一致的效果。
系统调用原理——特权级与中断
特权级
1、CPU可以在不同特权级别下执行指令,现代操作系统有两种特权指令——用户模式(User Mode)【用户态】
和内核模式(Kernel Mode)【内核态】
2、系统调用是运行在内核态,应用程序运行在用户态。
问题:用户态的程序如何运行内核态代码?
答:操作系统一般通过中断(Interrupt)来从用户态切换到内核态。
中断
1、中断一般具有两个属性,一个称为中断号(Linux使用0x80作为系统调用入口),一个称为中断处理程序,
中断号与中断处理程序一一对应
2、中断向量表,在内核中的一个数组,包含了中断处理程序的指针
Linux系统中断流程
注:
1、Linux使用int 0x80触发所有系统调用
2、系统调用都有一个系统调用号,系统调用号通常就是系统调用在系统调用表中的位置,
系统调用号由eax传入,用户将系统调用号放入eax中,然后使用int 0x80调用中断,中断服务程序
就可以从eax中取得系统调用号,例如sys_fork系统调用号为2
具体实例
1、系统调用,open、read、write…
2、库函数,fopen、fread、fwrite