一、系统调用:
系统调用是操作系统实现的方法(函数),存在内核空间。
1、基本概念及内容:
所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能(内核实现的一些方法),系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/0传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多。
这些系统调用按功能大致可分为如下几类:
- 设备/文件管理: 完成设备/文件的打开(open)、读(read)、写(write)、关闭(close)等功能。
- 进程控制: 完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信: 完成进程之间的消息传递或信号传递等功能。
- 内存管理: 完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。
2、系统调用实例:
例如要进行open()系统调用,打开文件,首先会将open()对应的系统调用号放入eax寄存器,然后产生0x80号中断,陷入内核(eax寄存器将系统调用号带入内核),内核态通过查找系统调用表,找到对应的系统函数方法并执行,将执行结果存入eax寄存器,返回给用户态,然后恢复程序的执行。
二、库函数:
库函数是用户自己实现或封装的方法,存在用户空间。
它可能调用封装了一个或几个不同的系统调用(printf调用write),也可能完全由用户态完成操作(atoi不调用任何系统调用)。
三、系统调用和库函数的区别:
1、系统调用由操作系统实现,存放在内核空间,是面向io、进程、内存等最底层的操作;库函数由用户实现,存放在用户空间,一般是面向应用开发的上层操作。
2、系统调用的可移植性差,不同操作系统的系统调用都是不同的;而库函数具有良好的可移植性,如c库里的方法不管在什么操作系统下都可以正常使用。
3、系统调用的开销大、相对执行时间长,因为会在用户态和内核态之间进行切换;库函数的调用开销小、相对执行时间短,只在用户态运行(仅限没有封装系统调用的库函数)。