【问题标题】:How do the standard C library and system calls work together?标准 C 库和系统调用如何协同工作?
【发布时间】:2012-10-22 03:50:28
【问题描述】:

我最近对编译器、标准库和内核的内部工作方式产生了兴趣。在搜索标准 C 库的源代码时,我遇到了 Glibc。但是在Glibc官网上写的是:the library which defines the ''system calls'' and other basic facilities such as open, malloc, printf, exit...

所以我猜Glibc实际上并没有提供标准C库的源代码,而是提供了这些函数的系统调用,然后内核来处理它们,对吗?

我想了解更多关于这些事情的信息。例如,sinprintfstrlen 函数如何在 C 程序中执行?如果 Glibc 只提供系统调用,那么这些函数的实际源代码在哪里?内核如何执行它们?在哪里可以找到执行这些功能的内核部分的源代码?

【问题讨论】:

  • glibc 的源代码用于构建 glibc 库。源代码由编译器翻译成可执行代码。
  • 你知道.so.a文件吗?
  • 是的,我知道 .so 和 .a

标签: c compiler-construction kernel glibc standard-library


【解决方案1】:

C 库是一个用户态库几乎就像任何库一样。

系统调用是内核提供的接口。 它们与 C 标准无关。它们是特定于操作系统的。 类 UNIX 操作系统之间存在一些相似之处,但这是一个不同的主题。

C 库中实现的一些函数最终会以一种或另一种方式调用系统调用。但这与任何其他库都是一样的。

我建议查看 OpenBSD 的 C 库。 Android手机也使用它。 它简单明了,并且有据可查。你可以找到它here

【讨论】:

  • 虽然 Android 上使用的 Bionic C 库确实包含来自 3 个主要 *BSD 的代码,但声称 Android 手机使用 OpenBSD C 库是相当牵强的。
  • 我同意@nos,需要注意的是Android使用的是Bionic libc,这是一个混蛋版本......
  • 只需查看官方存储库中大多数文件中的 CVS 标头即可。示例:github.com/android/platform_bionic/tree/master/libc/stdlib
【解决方案2】:

Glibc 提供库函数的代码,也提供系统调用定义。只有一小部分提供的函数是真正的系统调用。其他人将其代码放在库中,要么在内部完成所有工作,要么通过内部调用将其委托给内核。您可以在各种 libc 源代码中查看它们的工作原理。 Glibc、Eglibc、Newlib、Dietlibc 等的源代码都适合您。

虽然有可能让操作系统对任何 libc 调用都有系统调用,但由于很多原因,它没有完成。

【讨论】:

    【解决方案3】:

    您可以通过this page 了解系统调用。它很旧,但为您提供了想法和指向内核中实现调用的文件的指针。在一个典型的 Unix 系统中,只有几百个系统调用。例如,您可以看到 sys_open 或 sys_write。当您查看 fopen 或 open 之类的调用时,最终它们都映射到 sys_open。诸如 printf 或将映射写入 sys_write 之类的东西。

    内核调解诸如访问文件之类的事情,因此需要成为一个瓶颈,但是库通过将这些调用包装在有用的抽象中来使访问这些调用变得更容易,对于给定的系统调用,通常不止一个。图书馆本身不提供系统调用,它设置了一些东西,然后捕获到内核,内核实现它们。系统调用实际上是 libc 程序所针对的内核的 API。

    有些调用,例如 strlen,根本不需要内核访问,该调用可以只查看已经分配的内存。

    从用户空间探索这个的一个好工具是strace。给定一个程序,它将显示该程序进行的所有系统调用。您可以使用它来梳理 libc 调用如何映射到系统调用。

    【讨论】:

    • 我觉得 OP 正在寻找您发布的链接的第 2 部分中应该包含的内容。太糟糕了它的“..还没准备好..”
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2011-09-08
    • 2018-07-11
    • 2015-07-14
    • 2023-04-09
    • 2014-11-17
    • 2015-02-23
    相关资源
    最近更新 更多