系统调用和库函数的区别

系统调用和库函数的区别

我已经通过这个问题的回答但不太明白系统调用和库函数的区别。从概念上讲,两者有什么区别?

答案1

从概念上讲,库函数是进程的一部分。

在运行时,您的可执行代码及其依赖的任何库(例如 libc.so)的代码链接到单个进程中。因此,当您调用此类库中的函数时,它会作为进程的一部分执行,并具有相同的资源和权限。这与调用您自己编写的函数的想法相同(可能有例外,例如 PLT 和/或蹦床函数,如果您关心的话可以查找)。

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


例如,参见 Linux曼布克。当C程序调用malloc分配内存时,它是在调用glibc中的库函数。

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

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

答案2

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

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

系统调用通常反映为监控程序中的系统 CPU 使用情况。

答案3

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

系统调用 - 将控制权转移给操作系统(用户->系统过程->操作系统),并将处理器置于特权模式

答案4

  1. lib fun 受编译器支持,而 syscall 受操作系统支持
  2. Libcall 是特定的,而 syscall 是通用的,像 getc 一样,lib fun 一次只能访问一个字符,而不是字符串或逐字访问,但打开 syscall 可以用来打开文本文件、二进制文件和更多类型的文件。

相关内容