5

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

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

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

4

3 回答 3

5

C 库是一个用户态库,几乎与任何库一样。

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

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

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

于 2012-11-01T14:34:12.813 回答
1

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

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

于 2012-11-01T14:34:55.127 回答
0

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

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

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

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

于 2012-11-01T14:34:17.997 回答