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

问题描述 投票:0回答:5

有人可以解释一下这两者在linux中的区别吗?请尽可能深入了解操作系统采取的每一步。

linux operating-system system-calls libraries terminology
5个回答
18
投票

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

手册页显示:

2 系统调用(内核提供的函数)

3 库调用(程序库内的函数)

一张图就可以一目了然:

enter image description here

enter image description here


12
投票

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

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

这里做一点简化——处理器常用的方法是让进程显式触发异常(Intel 有替代的 SYSCALL 方法)。

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

类似的指令:

   INT #12

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

我们假设操作系统使用向量 123 来提供系统服务。

   INT #123

将调用系统服务。系统可以为每个系统服务保留一个单独的向量,也可以使用一个向量并进行调度。

所以你会做这样的事情:

  MOVL  #23, R0
  INT  #123

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

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

这就是发生的顺序:

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

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

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

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

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

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

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


6
投票

系统调用和库调用的相似之处在于它们都是由环境提供给应用程序的。两者的区别在于系统调用是在内核中实现的,而库调用是在用户空间中实现的。要进行系统调用,应用程序必须执行特殊的硬件和系统相关指令(通常是中断或特殊的

SYSENTER
调用)指令,这会触发上下文切换并将控制权转发给内核。另一方面,库调用与常规函数调用没有什么不同(唯一的区别是代码不驻留在主可执行文件中,而是驻留在共享库中)。


0
投票

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

系统调用是向操作系统请求服务。


0
投票

有人解释一下D/w库函数和系统调用吗

© www.soinside.com 2019 - 2024. All rights reserved.