C库的一个端口需要在C中实现吗?

Does a port of the C library need to be implemented in C?

本文关键字:实现 一个      更新时间:2023-10-16

我正在开发一个内核。编写内核的任务之一是必须移植C库。有些函数如memcmpstrlen等需要重写。大多数时候,我看到的代码是用C写的,然后用extern "C"包装。然而,这使我的构建过程变得复杂,因为有很多用C编写的文件,还有很多用c++编写的文件,这些文件必须链接在一起,这真是令人头疼。如果整个程序都能用c++写就好了。

这有意义吗?

如果该端口仅用于您的内核,那么您可以很好地做任何您想做的事情。如果您计划向内核用户提供对该库的访问权限,那么接口必须是c。然而,实现可以是您想要的任何语言。

现在对于大多数函数来说,使用c++函数然后创建一个C函数来访问c++函数并没有多大意义,因为函数本身不会使用c++(至少对于strlen()这样的函数,你不需要真正使用std::find(),你可以用一个简单的循环在C中重写)。

您还可以重用GNU C库中需要的函数。也就是说,把这些函数复制到你的实现中。只要确保你的驾照是一样的。为了提高速度,该库用各种汇编语言实现了许多这样的低级函数。例如,strlen()函数加载64位,并使用逻辑(NOT, AND, XOR…)确定是否存在0x00字节,这使得该函数非常高效。

GNU C库还包括调用内核函数的特殊函数。显然,你不会想要这些直接在你的内核中(好吧,可能不会,这取决于你的内核)。

最后,C库比strlen()等几个函数要复杂得多。它必须与成千上万的软件一起工作,所有这些软件都可能与略有不同的版本相关联。因此,strlen()实际上可能在同一个C库中有20个版本。在一段时间内(直到您的内核被许多人使用之前),您可能不会想要担心这个问题,但是对于在您的计算机上运行的软件的长期稳定性来说,它可能很重要。如果一个软件期望某个函数返回EINVAL(旧版本),而另一个软件期望返回EIO(新版本),这一点尤其重要。在处理成千上万的软件时,这种微小的差异是非常重要的。

再一次,听起来你的意思是在内核中有帮助函数。辅助函数在C库中可用,但不是实际的C库(我不认为内核以这种方式链接是一个好主意)。它应该是特定于内核的辅助函数库,您可以静态链接它。实际上,您应该只添加内核使用的函数,而不是更多。

最后,如果您的内核是用c++编写的,那么您的辅助函数也可以用c++编写。然而,如果你打算有一些小的部分只使用C语言,并且这些小的部分将使用一些辅助函数,那么用C语言编写这些辅助函数将会更容易。strlen()显然只在C语言中是必需的,因为在c++中你想使用std::string::length()成员函数来代替。