Linux 的主存中默认加载标准 C 库吗?

Linux 的主存中默认加载标准 C 库吗?

由于Linux内核的大部分都是用C语言编写的,因此当内核加载到主内存中时,标准C库是否也会随Linux内核一起加载?

如果这就是用 C 编写的程序比其他程序消耗更少内存的原因,因为标准 C 库已经加载,因此在 Linux 机器上运行时与用其他语言编写的程序相比也更快(页面错误更少)?

答案1

内核是用 C 编写的,但它不使用 C 库(如戴夫·汤普森_085指出,这是“独立式”)。即使这样做,与内核一起加载供内核使用的 C 库也只能供内核使用(除非内核以某种方式使其显式地可供用户空间访问),因此它无助于减少程序的内存要求。

也就是说,在大多数情况下,最早的程序在内核启动后运行(initramfs 中的程序,尽管它们将使用自己的 C 库副本;最终,init)使用 C 库,因此最终会被映射早期,库中被广泛使用的部分很可能始终保留在物理内存中。

内核包含以下实现许多 C 库的函数,或变体(例如,printk代替printf);但它们并不都完全遵循标准。在某些情况下,C 库函数的实现编译器被用来代替。

(请注意,绝大多数用 C 以外的语言编写的程序最终都使用 C 库。)

答案2

Linux 的主存中默认加载标准 C 库吗?

不。

内核启动的第一个用户空间进程称为init,其目的是启动其他所有进程,并获取僵尸子进程(其父进程在其退出之前退出的进程,因此没有其他进程可以获取其退出状态)。

因为init几乎总是使用标准C库,所以标准C库一启动就加载到内存中init。但这只是一个副作用,内核并不关心。

内核与标准C 库无关。 (内核写在独立式C,标准C库所在的环境不是可用的。)

答案3

内核上下文中的“C 标准库”更多的是一种抽象形式,这意味着存在一些可重用的实用程序子例程,可以执行 C 语言指定的操作。就像不是由C语言而是由内核本身定义的可重用子例程一样,它们不以“共享对象”(动态库)形式存在。相反,它们与内核一起编译并组装成一个内核可执行文件。

您可以在这里找到一些库代码,例如 memcpy、strcmp/strncmp https://elixir.bootlin.com/linux/latest/source/arch/x86/lib

因此,内核附带了自己的 C 库实现,并且不与任何其他用户级代码共享它,也不使用用户提供的 C 库来启动。事实上,每个用户层程序都可以做同样的事情,例如静态链接(包含、打包)C 库并且不与其他任何人共享。

为了回答你的最后一个问题,没有用户态程序与内核共享 C 标准库。

答案4

C 标准库的简称是

我们首先要明确的是是一个像其他图书馆一样的图书馆。

内核本身不使用 libc (正如你可以读到的这里)。

可以动态或静态链接。

动态链接

该库未嵌入到可执行文件中。当程序启动时,将从系统路径加载库。例如/lib/x86_64-linux-gnu/libc.so在Linux上。

事情来了:如果第二个程序启动没有再次加载。相反,它与第一个程序共享库。这意味着不需要新的内存。

静态链接

如果静态链接,则库位于可执行文件内。所以如果你运行两个程序在内存中存在两次。

相关内容