Linux 内核:使用哪种 C Linux 内核?

Jam*_*eal 0 c linux kernel

我在这里很困惑。他们说linux内核是用C开发的。但据我所知,C库是建立在Linux内核之上的,所以在内核领域,应该还没有C。再说一次,我从 GitHub 上看到的内核代码都是用 C 编写的,并且都带有那些奇怪的包含!对我来说,这就像经典的鸡与蛋的谜题一样。哪一个先存在?

预先感谢您对我的愚蠢问题的耐心。

Mag*_*sch 7

C 不是构建在 Linux 之上的。C 本身是一种编译型编程语言,编译器将其转换为机器代码。根据您的操作系统,编译器可能会采取不同的方式(对于某些 C 代码)。

但 C 语言本身实际上只是一个很长的列表,列出了函数应该做的事情以及事情应该如何表现,而编译器只是遵守这些规则。这就是所谓的 C“标准”。有一个委员会制定它,并且有多个版本。

Linux Kernel 确实是用 C 语言编写的。所以有人编写了它,然后使用符合标准的 C 编译器对其进行了编译。

至于库,它们是可选的。Linux 内核是在没有依赖关系的情况下开发的,这意味着它用纯 C 语言实现了它本身所需的一切。您看到的这些文件只是内核本身的文件,定义了它的函数、类型等。

  • @JamesReal 没有明确的 c“库”。C 本身只是一个关于如何将 C 代码转换为机器代码的标准。编译器遵循这一点。库的存在是为了让日常程序员可以完成许多已经完成的工作。编写 Linux 的人却没有这样的奢侈。换句话说,你如何了解 C(以及所有标准库)并不意味着他们必须如何使用它。 (2认同)

Bar*_*mar 5

C 规范区分了托管实现独立实现。有关一些详细信息,请参阅独立实施和托管实施之间是否有有意义的区别?/sf/ask/2461514261/

区别之一是独立实现不需要提供所有标准库函数。当编译 Unix 内核时,我们以独立模式使用编译器,因为许多标准库都依赖于它们下面的内核。特别是,标准 I/O 库需要一个带有文件的操作系统,但内核是所有这些都实现的地方,因此不能从内核使用它。

虽然有一些库函数(例如 中的库函数)<string.h>在内核中可能是相同的,但为了简单起见,它不与任何标准库链接。有一些类似于strcpy()内核中的函数,但它们是标准库代码的副本,而不是与相同的库链接(在许多系统上,标准C库是动态链接的,但这在内核中是不可行的)。

因此内核使用了 C语言,但没有使用 C