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

drd*_*dot 12 linux operating-system

谁能解释这两个在linux中的差异?请尽可能深入到操作系统的每个步骤.

Rah*_*thi 10

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

手册页说:

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

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

图画图像可以说清楚:

在此输入图像描述

在此输入图像描述

  • @dannycrane,在第二张图中,第四步是系统调用。有关详细信息,您可以阅读这篇不错的文章... http://www.thegeekstuff.com/2012/07/system-calls-library-functions/ (2认同)

use*_*003 9

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

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

这里做一点简化 - 处理器使用的常用方法是让进程明确触发异常(英特尔有一个备用的SYSCALL方法).

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

一条指令:

   INT #12
Run Code Online (Sandbox Code Playgroud)

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

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

   INT #123
Run Code Online (Sandbox Code Playgroud)

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

所以你会做这样的事情:

  MOVL  #23, R0
  INT  #123
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

  4. 系统服务可以完成它需要做的任何事情.

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

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

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


el.*_*ado 6

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

  • 完全没有,例如。`strcmp` 是一个完全在用户空间中实现的库调用,不调用任何内核代码。另一方面,系统库为大多数系统调用提供了方便的包装函数。 (2认同)