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

What is the difference between system call and library call?

谁能解释一下 linux 中这两者的区别?请尽可能深入地了解操作系统执行的每个步骤。

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

手册页说:

2 System calls (functions provided by the kernel)

3 Library calls (functions within program libraries)

一张图就能说清楚:

系统调用和库调用的相似之处在于它们是由环境提供给应用程序的。两者的区别在于系统调用是在内核中实现的,而库调用是在用户中实现的space。要进行系统调用,应用程序必须执行特殊的硬件和系统相关指令(通常是中断或特殊的 SYSENTER 调用)指令,这会触发上下文切换并将控制权转发给内核。另一方面,库调用与常规函数调用没有区别(唯一的区别是代码不驻留在主要可执行文件中,而是驻留在共享库中)。

看评论,我试试看。系统服务是一个以提升的特权(通常是内核模式)执行的过程。其他一切都是库调用。

底层硬件为用户应用程序进入内核模式提供了一个入口。操作系统为基本的系统安全守卫着这扇门。

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

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

指令类似于:

   INT #12

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

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

   INT #123

会调用系统服务。系统可能会为每个系统服务保留一个单独的向量,或者它可以使用一个向量并进行调度。

所以你会这样做:

  MOVL  #23, R0
  INT  #123

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

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

接下来的顺序是:

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

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

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

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

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

  6. 包装器可以在寄存器中解压参数 return。

  7. 包装器 return 发送给调用者。

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

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