系统调用:用户在编程时可以调用的操作系统功能
系统调用是操作系统提供给编程人员的唯一接口,使CPU状态从用户态陷入内核态
每个操作系统都提供几百种系统调用(进程控制,进程通信,文件使用,目录操作,设备管理,信息维护等)
应用程序->系统调用;应用程序->C函数库/API接口->系统调用;
内核函数处理系统调用
系统调用机制的设计
1.中断/异常机制支持系统调用服务的实现;2.选择一条特殊指令:陷入指令(访管指令),引发异常,完成用户态到内核态的切换;3.系统调用号和参数:每个系统调用都事先给定一个编号(功能号)4. 系统调用表:存放系统调用服务例程的入口地址
参数传递过程问题
怎样实现用户程序的参数传递给内核?
3种常用实现方法
1.由陷入指令自带参数:陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限的参数;2. 通过通用寄存器传递参数,这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量 3. 在内存中开辟专用堆栈区来传递参数。
系统调用执行过程
当CPU执行到特殊的陷入指令时:
中断/异常机制:硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序
系统调用总入口程序:保存现场;将参数保存在内核堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数
执行系统调用例程
恢复现场,返回用户程序