中断,异常,系统调用;系统调用 vs 库函数调用

中断,异常,系统调用比较

背景

计算机启动后会加载操作系统的内核,然后将控制权交给操作系统内核,这一阶段是可以信任的。但在操作系统内核之上,还有很多的应用程序,没有办法做到对这些应用程序的完全信任,然而这些应用程序要使用操作系统提供的服务,并且只有操作系统执行特短命令(具有特殊权限的指令,这类指令只用于操作系统或其他系统软件,一般不直接提供给用户使用),这时就需要解决一个操作系统内核与外界打交道的问题,也就是说可以信任的内核必须对外界提供某种访问的接口。

同样在使用计算机的过程中,我们除了跟应用程序打交道外,程序或计算机系统在运行过程中会有各种各样的问题,为了能够让计算机系统对外界做出适当的反应,比如及时反映键盘的输入,需要提出中断机制,也就是当外设与系统有交互的时候需要如何处理。

还有一种情况是使用应用程序的过程中出现了一些问题,这些问题是程序编写者事先没有预料到的,对于这种异常情况把它的控制权转交给操作系统,由操作系统来处理它,这就是应用程序执行中遇到意外的情况由异常来处理。

系统调用则是为了解决用户程序如何来使用系统服务的问题。操作系统需要通过系统调用来提供一个接口,让应用程序既方便的使用内核提供的服务,又不至于用户的行为对内核的安全产生影响。

  • 为什么需要中断,异常和系统调用
    • 在计算机运行中,内核是被信任的第三方
    • 只有内核可以执行特权指令
    • 方便应用程序
  • 中断和异常希望解决的问题
    • 当外设连接计算机时,会出现什么现象?
    • 当应用程序处理意想不到的行为时,会出现什么现象?
  • 系统调用希望解决的问题
    • 用户应用程序如何得到系统服务?
    • 系统调用和功能调用的不同之处?

操作系统内核和外界打交道基本上就是中断,异常和系统调用这三个接口

系统调用是应用程序主动向操作系统发出的服务请求。

异常时非法指令或者其他原因导致的指令执行失败之后的处理请求。

中断是硬件设备对操作系统提出的处理请求。

中断,异常和系统调用的比较

  • 源头
    • 中断:外设
    • 异常:应用程序意想不到的行为
    • 系统调用:应用程序请求操作系统提供服务
  • 响应方式
    • 中断:异步
    • 异常:同步
    • 系统调用:同步或异步
  • 处理机制
    • 中断:持续,对用户应用程序是透明的
    • 异常:杀死或者重新执行意想不到的应用程序指令。异常会处理当前所出现的问题
    • 系统调用:等待和持续。等待用户提出之后处理,等待然后再继续

函数调用和系统调用的不同之处

调用一个函数需要把参数压到堆栈中,然后转到相应函数去执行,执行时从堆栈中获取参数信息执行,返回的结果放在那里再返回回来,这样在上面的函数调用就知道相关的返回结果,然后利用这个结果继续往下执行。而对于系统调用而言,它由于内核是受保护的,而应用程序是它自己的区域,为了保护内核的事项,这里内核和用户态的应用程序之间使用不同的堆栈,所以在这里会有一个堆栈的切换,切换之后由于处于内核态,就可以使用特权指令,这些特权指令所导致的结果就是这时可以直接对设备进行控制,而这种操作在用户态是不可能进行。

系统调用使用的是INTIRET指令。系统调用使用的是CALLRET指令。

系统调用 VS 库函数调用

系统调用

计算机系统中有两种模式,一种是用户模式,一种是内核模式。在计算机系统中,有不同类型的进程在计算机系统上运行。当用户运行应用程序时,它被称为处于用户模式或计算机处于用户模式。当对硬件资源有需求时,进程向内核发送请求以获得进程访问权,计算机进入内核态。这些请求是通过系统调用发送的。计算机经常在这两种模式之间切换。每当任务完成时,计算机就会从内核模式返回到用户模式。这种转换模式称为上下文切换。

库函数调用

库函数调用是一种使用编程库中定义的特定函数的请求。库文件包含打包成一个文件以供使用的代码数据文件,目标文件。要进行库调用,应先导入库。库调用可能依赖于系统调用来完成任务。

区别

系统调用库函数调用
系统调用是程序进入内核模式以访问进程的请求库调用是程序发出的访问编程库中定义的库函数的请求
在内核模式下,程序可以直接访问内存和硬件资源在用户模式下,程序不能直接访问内存和硬件
在系统调用中,从用户模式切换到内核模式在库调用中,该模式仅在用户模式下执行
在系统调用中,执行的速度比库调用慢,因为要经过上下文切换的转换模式。在库调用中,由于没有上下文切换模式,因此执行过程的速度比系统调用快
系统调用是内核提供的进入内核模式访问硬件资源的函数库调用是编程库提供的用于执行任务的函数
系统调用是内核的入口点,因此它们与程序无关库函数链接到我的程序中
系统调用是不可移植的库调用可以移植
系统调用比库调用拥有更多的权限,因为它运行在内核模式下库调用的权限低于系统调用,它仅运行在用户模式下
系统调用由系统提供,由系统内核执行库调用包括ANSI C标准库
在系统调用中,所有函数都是内核的一部分库调用中,所有库函数都是编程语言标准库文件的一部分
每当程序需要内存或硬件资源时,它都会通过系统调用直接向内核发送请求以获取进程访问权限每当程序员或开发人员使用特定的库函数时,程序员必须首先通过在其程序中包含头文件来调用或调用库函数,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值