系统调用和库函数之间的区别


Answers:


19

从概念上讲,库功能是您过程的一部分。

在运行时,您的可执行代码和它依赖的任何库的代码(例如libc.so)都被链接到单个进程中。因此,当您在此类库中调用函数时,该函数将以相同的资源和特权在您的流程中执行。这与调用您自己编写的函数的想法相同(可能有例外,如PLT和/或蹦床函数,您可以在需要时查找它们)。

从概念上讲,系统调用是一种特殊的接口,用于从您的代码(通常是无特权的)到内核(该内核有权根据需要提升特权)进行调用。


例如,请参阅Linux man brk。当C程序调用malloc分配内存时,它正在glibc中调用库函数。

如果在进程内部已经有足够的空间用于分配,则它可以执行任何必要的堆管理并将内存返回给调用方。

如果不是,则glibc需要从内核请求更多的内存:它(可能)调用brkglibc函数,该函数又调用brksyscall。只有通过syscall将控制权传递给内核之后,才能修改全局虚拟内存状态以保留更多内存,并将其映射到进程的地址空间。


11

添加到“无用”的答案:
库函数比系统调用更快,并且通常不包含权限/安全性考虑,因为它们以进程的特权及其内存运行。

另一方面,由于Syscall在内核中运行,因此可以访问系统中的所有内容,因此它们需要控制调用过程在调用它们时可以执行的操作(验证它是否具有打开文件的权限,例如例如,此外,由于系统调用位于内核中,因此调用它们需要在CPU中进行上下文切换,相对于仅调用库调用而言,这是一个非常繁重的过程。

系统调用通常反映为监视程序中的系统CPU使用率。


0
  1. lib fun支持编译器,而syscall支持OS
  2. Libcall是特定于系统调用的,而syscall是通用的,例如getc,一次lib fun一次只能访问一个字符,而不能按字串或逐字访问,但是打开syscall可以用来打开文本文件,二进制文件和许多其他类型的文件。

0

库调用-调用链接到应用程序的子例程(通过包含或添加库)。

系统调用-将控制权转移到OS(用户-> system proc-> OS),并将处理器置于特权模式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.