为什么我们不能在内核开发中使用C标准库函数?

我刚开始学习内核开发,有一点疑问。 为什么我们不能在与c库连接之后在内核开发中使用c函数? 为什么内核从来没有与ac库链接,但有自己的一些标准的c函数,如printk()而不是printf()的实现。 如果内核是用c编写的,并且在ac编译器的帮助下编译的,那么为什么我们不能使用c库中的标准函数呢?

因为你熟悉的GNU C库是为用户模式而不是内核模式实现的。 内核无法访问用户空间API(可能会调用Linux内核的系统调用 )。

从coreelNewbies常见问题

我可以在内核中使用库函数吗?

系统库(如glibc,libreadline,libproplist,其他)通常对用户空间程序员可用的内核程序员是不可用的。 加载进程时,加载程序会自动将任何相关库加载到进程的地址空间中。 内核程序员不可以使用这种机制:忘记ISO C库,唯一可用的是内核中已经实现(和导出)的内容以及你可以实现的内容。

请注意,可以“转换”库在内核中工作; 然而,它们并不适合,过程繁琐且容易出错,堆栈处理可能存在重大问题(内核被限制在少量的堆栈空间,而用户空间程序没有这个限制)导致随机内存损坏。

许多常用的功能已经在内核中实现了,有时是在“轻量级”版本中,而不是像用户空间一样有效。 在从头开始编写自己的版本之前,请务必对可能可以使用的任何函数进行grep头文件。 一些最常用的是include / linux / string.h。

每当你觉得你需要一个库函数,你应该考虑你的设计,并问自己,如果你可以移动一些或所有的代码到用户空间。

如果您需要使用标准库中的函数,则必须重新实现该功能,原因很简单 – 没有标准的C库。

C库基本上是在Linux内核(或其他操作系统的内核)的顶部实现的。

例如,C库的mkdir(3)函数基本上只不过是Linux内核的系统调用mkdir(2)的一个封装。

http://linux.die.net/man/3/mkdir http://linux.die.net/man/2/mkdir