标准C库和系统调用如何协同工作?

我最近对编译器,标准库和内核的内部工作感兴趣。 当我在寻找标准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只提供系统调用,那些函数的实际源代码在哪里? 内核如何执行它们? 哪里可以找到执行这些function的内核部分的源代码?

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

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

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

我建议从OpenBSD查看C库。 Android手机也使用它。 它简单明了,记录完备。 你可以在这里找到它。

Glibc提供库函数的代码,还提供系统调用定义。 提供的function中只有一小部分是系统调用。 其他人在库中有代码,或者在内部完成所有工作,或者通过内部调用将其委托给内核。 您可以在varous libc源中查看它们的工作方式。 Glibc,Eglibc,Newlib,Dietlibc等的来源适合您。

虽然可以让操作系统对任何libc调用进行系统调用,但是由于很多原因而无法完成。

您可以在此页面感受系统调用。 它已经过时了,但它提供了一个想法和一个指向内核中实现调用的文件的指针。 在典型的unix系统中,有数百个系统调用。 例如,您可以看到sys_open或sys_write。 当您查看fopen或open这样的调用时,在一天结束时,它们都会映射到sys_open。 像printf或写入映射到sys_write的东西。

内核调解诸如访问文件之类的内容,因此需要成为一个阻塞点,但是库通过将它们包含在有用的抽象中来更容易地访问这些调用,对于给定的系统调用,它通常不止一个。 libraray本身不提供系统调用,它设置了东西,然后陷阱到实现它们的内核。 系统调用实际上是libc编程的内核的API。

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

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