系统调用和库调用有啥区别?
Posted
技术标签:
【中文标题】系统调用和库调用有啥区别?【英文标题】:What is the difference between system call and library call?系统调用和库调用有什么区别? 【发布时间】:2015-07-01 05:54:02 【问题描述】:谁能解释这两者在linux中的区别?请尽可能深入了解操作系统执行的每个步骤。
【问题讨论】:
@MartinJames,这是一个奇怪的问题。我希望教授在我上操作系统课的时候给这个作业。 【参考方案1】:Library Functions 是一个普通函数,它被放置在名为 library 的函数集合中。
系统调用是对操作系统的服务请求。
【讨论】:
【参考方案2】:看评论,让我试试这个。系统服务是一个以提升的特权(通常是内核模式)执行的过程。其他一切都是库调用。
底层硬件为用户应用程序进入内核模式提供了一道门。操作系统为基本的系统安全守卫着这道门。
在这里做一点简化 --- 处理器使用的一种常用方法是让进程显式触发异常(Intel 有另一种 SYSCALL 方法)。
系统将有一组中断/异常向量(指向处理程序的指针)用于响应异常或中断(例如页面错误,除以零)。系统将为硬件异常和中断定义一组向量(通常是低编号的向量)。但是,它们通常会留下插槽供操作系统使用。
类似的指令:
INT #12
将显式触发异常并调用向量中的第 12 个过程。系统可能允许您模拟除以零异常来执行此操作
让我们假设操作系统使用向量 123 来提供系统服务。
INT #123
会调用系统服务。系统可能会为每个系统服务保留一个单独的向量,或者它可以使用一个并分派。
所以你会做这样的事情:
MOVL #23, R0
INT #123
寄存器 0 中的值 23 告诉中断处理程序调用系统服务 #23。
所以你可以看到这一切都需要汇编语言。每个操作系统所做的就是创建可以像高级语言中的函数一样调用的包装器。
这就是接下来发生的事情的顺序:
用户使用普通参数调用命名包装器。包装器为系统服务设置寄存器和堆栈。
包装器触发异常分派到系统服务。
然后系统服务必须检查所有参数。这是系统服务具有高开销的原因之一。内核模式下的异常会导致蓝屏死机。如果系统服务需要写入用户提供的缓冲区,它需要确保它写入的每个字节都是可写内存。
系统服务做它需要做的任何事情。
系统服务执行硬件指令以从异常或中断中返回。这将返回到用户模式并返回到包装函数。
包装器可以解压寄存器中返回的参数。
包装器返回给调用者。
【讨论】:
【参考方案3】:由内核处理的低级内核调用是系统调用。
手册页说:
2 系统调用(内核提供的函数)
3 库调用(程序库中的函数)
一张图就可以看得一清二楚:
和
【讨论】:
这个级别太高了。我正在寻找每一个小步骤。 @dannycrane:- 您可以查看 wiki:en.wikipedia.org/wiki/System_call 了解更多详情。 @dannycrane:- 我可以给你一个小例子,比如 fopen() 是一个库调用,而 open() 是一个系统调用。现在假设您从 C 程序的头文件中调用 fopen()。现在编程环境将从内核调用系统调用 open() 并执行其文件打开任务。再次执行后,控制流返回用户模式。您可以查看手册页的 FOPEN(3) 和 OPEN(2) 库调用图很精彩。你有类似的系统调用吗? @dannycrane,在第二张图中,第四步是系统调用。有关详细信息,您可以阅读这篇不错的文章...thegeekstuff.com/2012/07/system-calls-library-functions【参考方案4】:系统调用和库调用的相似之处在于它们是由环境提供给应用程序的。两者的区别在于系统调用是在内核中实现的,而库调用是在用户空间中实现的。要进行系统调用,应用程序必须执行特殊的硬件和系统相关指令(通常是中断或特殊的SYSENTER
调用)指令,这会触发上下文切换并将控制权转发给内核。另一方面,库调用与常规函数调用没有区别(唯一的区别是代码不驻留在主可执行文件中,而是驻留在共享库中)。
【讨论】:
简单的库调用在某种程度上(并非在所有情况下)都是系统调用的包装器。 完全没有,例如。strcmp
是完全在用户空间中实现的库调用,不调用任何内核代码。另一方面,系统库为大多数系统调用提供了方便的包装函数。以上是关于系统调用和库调用有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章