一、系统调用
1、系统调用通常通过函数进行调用
2、系统调用在用户空间进程和硬件设备之间添加了一个中间层。
3、在Linux中,系统调用是用户空间访问内核的唯一手段,除异常和陷入外,它们时内核唯一的合法入口。
4、中间层的作用:
(1)为用户空间提供了一种硬件的接口抽象
eg:当需要读写文件时,应用程序就可以不用管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型
(2)系统调用保证了系统的稳定和安全
作为硬件设备和应用程序的中间人,内核可以基于权限和其他一些规则对需要进行的访问进行裁决
eg:这样可以避免应用程序不正确的使用硬件设备,窃取其他进程的资源,或做出其他什么危害系统的事情
(3)每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口
如果应用程序可以随意访问硬件而内核又对此一无所知的话,几乎就没法实现多任务和虚拟内存,也不可能实现良好的稳定性和安全性
5、在Linux中,系统调用是用户空间访问内核的唯一手段,除异常和陷入外,它们时内核唯一的合法入口。
二、系统调用号
在Linux中,每个系统调用被赋予一个系统调用号。这样,通过独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用,进程不会提及系统调用的名称
系统调用号一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。此外,如果一个系统调用被删除,它所占用的系统调用号也不允许被回收调用,否则,以前编译过的代码会调用这个系统调用,但事实上调用的是另一个系统调用。Linux有一个“未实现”系统调用sys_ni_syscall(),它除了返回-ENOSYS外不做任何其他工作。这个错误号就是专门针对无效的系统调用而设的。虽然很罕见,但如果一个系统调用被删除,或者变得不可用,这个函数就要负责“填补空位”
内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_table中,它与体系结构有关,一般在entry.s中定义。这个表中为每一个有效的系统调用指定了唯一的系统调用号
三、系统调用的性能
linux系统调用比其他许多操作系统执行的快。Linux令人难以置信的上下文切换是一个原因;进出内核都被优化得简洁高效。另外一个原因是系统调用处理程序和每个系统调用本身也非常简洁