第五章读书笔记
第一部分:内核通信桥梁---系统调用
系统调用解析:
操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。
系统调用原理:
操作系统中的状态分为管态(核心态)和目态(用户态)。不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指令。用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统调用。
系统调用接口:
目的是为了方便用户使用。系统功能调用是操作系统提供给程序设计人员的一种服务。程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。
linux常见接口:
fork 创建一个新进程
execve 运行可执行文件
exit 中止进程
getpid 获取指定进程pid
等等
第二部分:系统调用与程序
系统调用定义:asmlinkage long sys_getpid(void)
引入系统调用号机制:
定义:在Linux中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。
通俗说法:就是一张索引表或者目录,对象为调用函数
注意:
1 系统调用号一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。
2 如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,否则,以前编译过的代码会调用这个系统调用,但事实上缺调用的是另一个系统调用。
3 Linux有一个“未实现”系统调用sys_ni_syscall(),它除了返回-ENOSYS外不做任何其他工作,这个错误号就是专门针对无效的系统调用而设的。虽然很罕见,但如果一个系统调用被删除,或者变得不可用,这个函数就要负责“填补空位”。
4 内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_table中。它与体系结构有关,一般在entry.s中定义。这个表中为每一个有效的系统调用指定了惟一的系统调用号。
系统调用实现过程:
1 通知内核--------------------------通常用户态引起异常或陷入,常用中断
2 指定恰当的系统调用(对号入座)----eax寄存器将系统调用号传递给内核,call *sys_call_table执行
3 保护上下文-----------------------SAVE—ALL实现全部保存压栈
4 参数传递-------------------------ebx,ecx,edx顺序存放参数
5 系统调用-------------------------系统调用函数执行
6 参数验证-------------------------数据或者指针访问
7 函数反馈返回---------------------eax放回返回值
8 内核转用户态继续执行-------------结束内核态
总结
系统调用就是一个沟通的方式,为用户提供更多的需求服务,尽可能的利用自己现有的资源,这是操作系统应该发展的方向也是计算机能为我们提供更好更快服务的保证