系统调用和库调用有什么区别?

时间:2015-04-23 07:39:38

标签: linux operating-system

有人可以在linux中解释这两者的差异吗?请尽可能深入到操作系统的每个步骤。

4 个答案:

答案 0 :(得分:9)

内核处理的低级内核调用是系统调用。

手册页说:

  

2系统调用(内核提供的功能)

     

3个库调用(程序库中的函数)

图片图片可以说清楚:

enter image description here

enter image description here

答案 1 :(得分:8)

观看评论,让我试一试。系统服务是使用提升的权限(通常是内核模式)执行的过程。其他一切都是图书馆电话。

底层硬件为用户应用程序提供了进入内核模式的门。操作系统保护此门以获得基本的系统安全性。

在这里做一些简化 - 处理器使用的常用方法是让进程显式触发异常(英特尔有一个备用的SYSCALL方法)。

系统将具有一组中断/异常向量(指向处理程序过程的指针),用于响应异常或中断(例如,页面错误,除以零)。系统将为硬件异常和中断定义一组向量(通常是低编号的向量)。但是,它们通常会留出供操作系统使用的插槽。

类似的指令:

   INT #12

将显式触发异常并在向量中调用第12个过程。系统可能允许您模拟除此之外的异常

让我们假设操作系统使用向量123进行系统服务。

   INT #123

会调用系统服务。系统可能为每个系统服务保留一个单独的向量,或者它可以使用一个和分派。

所以你会做这样的事情:

  MOVL  #23, R0
  INT  #123

寄存器0中的值23告诉中断处理程序调用系统服务#23。

所以你可以看到这一切都需要汇编语言。每个操作系统所做的是创建可以像高级语言一样调用函数的包装器。

然后是发生的事情的顺序:

  1. 用户使用普通参数调用命名包装器。包装器为系统服务设置寄存器和堆栈。

  2. 包装器触发调度到系统服务的异常。

  3. 然后系统服务必须检查所有参数。这是系统服务开销很高的原因之一。内核模式中的异常导致蓝屏死机。如果系统服务需要写入用户提供的缓冲区,则需要确保它写入的每个字节都是可写内存。

  4. 系统服务会做任何需要做的事情。

  5. 系统服务执行硬件指令以从异常或中断返回。返回用户模式并返回包装函数。

  6. 包装器可以解压缩寄存器中返回的参数。

  7. 包装器返回给调用者。

答案 2 :(得分:3)

系统调用和库调用类似,它们由环境提供给应用程序。两者之间的区别在于系统调用是在内核中实现的,而库调用是在用户空间中实现的。要进行系统调用,应用程序必须执行特殊的硬件和系统相关指令(通常是中断或特殊GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], /*........Other attribute here..........*/ [ 'attribute' => 'status_dosen', 'value' => function ($data){ return $data->status_dosen==1 ? "Approved": ($data->status_dosen==NULL ? "Pending": "Rejected"); } ], ]); 调用)指令,该指令触发上下文切换并将控制权转发给内核。另一方面,库调用与常规函数调用没有区别(唯一的区别是代码不在主可执行文件中,而是在共享库中)。

答案 3 :(得分:0)

库函数是一个普通的函数,放在称为库的函数集合中。

系统调用是向OS提供服务的请求。