操作系统学习笔记
一、系统调用、异常和中断的区别
1.来源
(1)系统调用:来源于应用程序,应用程序主动向操作系统发出服务请求。
(2)异常:来源于不良的应用程序,就是是非法指令或其他坏的处理状态。
(3)中断:来源于外设,来自不同的硬件设备的计时器和网络的中断。
2.操作系统对于它们的响应状态
(1)系统调用:等待和持续。
(2)异常:杀死或重新执行。
(3)中断:持续,但对于用户应用程序来说是透明的。
3.处理时间
(1)系统调用:同步或异步。
(2)异常:同步。
(3)中断:异步。
二、关于系统调用
1.解释
系统调用是需要操作系统提供服务,因为这些服务不能由应用程序直接执行,而是需要操作系统为我们执行,这种服务需要一种接口,我们就称它为系统调用接口,有了这个接口之后我们的操作系统就能为应用程序提供各种各样的服务。应用程序通过对这个接口的调用来实现间接对计算机的控制和管理。POSIX就是一种通用、可移植的系统调用的标准。应用程序通过一个库来直接或间接的访问系统调用的接口,这就会触发一个由用户态到内核态的转换。从而使计算机的控制权由应用程序交到了操作系统手中,操作系统可以对应用程序发出的这个系统调用的参数,id号进行识别,以便对他对系统调用进行识别,完成具体的服务。
2.函数调用和系统调用的区别
函数调用:在同一个栈空间完成了参数的传递和返回。
系统调用:应用程序和操作系统拥有各自的堆栈,当应用程序发出系统调用之后,需要由应用程序的堆栈切换到操作系统的堆栈,同时还要进行由用户态到内核态的转换,这会造成一定的额外开销,这个额外开销的回报就是安全可靠。
3.跨越操作系统边界的开销
(1)需要有一张映射表,这张表中存储了系统调用号或中断号和其所对应的处理例程的地址。操作系统知道了系统调用号或中断号,通过这张表就可以找到相应的处理例程并调用,从而为应用程序提供服务。
(2)需要有一个堆栈,来保存操作系统的状态,操作系统退出时把当前状态保存到堆栈,进入时再把这个堆栈恢复。应用程序也是如此。
(3)操作系统不信任应用程序,会检查系统调用时应用程序传递来的参数。
(4)操作系统处理完某些数据时需要把一些数据从内核空间拷贝到用户空间。
(5)随着应用程序的执行,会引起内存状态的改变,cache和tob有可能会刷新,这也会造成一定额外开销。
总结:虽然以上操作会造成很多额外开销,但是这些开销是值得的,只有这样才能保证我们的操作系统在安全可靠的环境下执行。