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

时间:2012-11-01 14:23:09

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

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