将用户空间代码移植到内核空间

到目前为止,我已经有了一个大部分用C语言编写的用户空间大系统。 现在我需要将代码编译为内核模块。 为此,afaik,我至less应该重写代码,并用它们的内核等价物replacemalloccallocfreeprintf ,因为这些函数完全是用户空间函数。 但问题是,我没有系统中使用的一些定制库的源代码,这些库在其函数内部调用malloc等。 所以,基本上,我可能需要重新实现整个图书馆。

现在的问题是:如果我将自己的malloc实现作为kmalloc的包装器,将会是一个非常肮脏的黑客攻击,如下所示:

 void *malloc(size_t size) { return kmalloc(size, GFP_USER); } 

然后将此实现链接到系统代码,这将消除模块错误中的所有未知符号

其实我以为这是一个普遍的问题,有人会写这样一个kmalloc包装,但我已经search了几天,没有任何用处。

编辑:这样做的原因是,我所说的系统是一个在VxWorks实时操作系统上运行的实时应用程序,现在我们要将它移植到Linux RTAI上,其中应用程序主要运行在内核空间中。 但是我想在用户空间中也有实时的可能性,所以,我应该按照Mike的build议,将代码分离到内核和用户空间部分,并使用共享内存进行通信。

我从来没有见过这样做过。 在以前的工作中,我确实需要做类似的工作(在我们的手机中,出于节能的原因,我们不得不从用户空间的内核中移出一部分代码),但这就是我做的。代码和移动它,并在那一小部分。

当我这样做时,我将用户空间调用更改为内核调用,原因主要有两个:

  1. 这种方式不那么令人困惑(其他人在查看代码时并不知道为什么我从内核中调用“malloc”)

  2. mallockmalloc不能完全相同。 我的意思是

    2A。 kmalloc需要一个flags参数,在你上面的例子中你对它进行了硬编码。 如果你以后决定要在某些地方而不是其他地方改变它, (假设你有许多不同的地方可以获得动态内存)。

    2B。 kmalloc不会像malloc一样给你记忆。 malloc()会给你你传递的字节数size_t size 。 另一方面, kmalloc()位于内核中,因此正在处理系统的物理内存,该内存仅在页面大小的块中可用; 因此当你调用kmalloc()你将只获得某些预定义的固定大小的字节数组。 如果你没有意识到这一点,你可能会问一个特定的块,从而获得比你需要的更多的内存…你的代码的直接端口不会保护你。

    2C。 头文件也必须改变。 显然你不能在内核中包含<stdlib.h> ,所以只是因为你“包装”了malloc调用,你仍然需要去替换头文件。

上面2b中我的观点的一个简单例子:

 void * stuff; stuff = kmalloc(1,GFP_KERNEL); printk("I got: %zu bytes of memory\n", ksize(stuff)); kfree(stuff); 

要显示分配的实际内存量:

 [90144.702588] I got: 32 bytes of memory 

无论如何…从技术上讲,你如何描述它,应该工作得很好。 都采取size_t并返回一个void *所以它应该工作; 但是请注意,进入内核的代码越多,确定性越小,而且malloc() <=> kmalloc()看起来不是1:1。

试图使我的RTAI代码在用户和内核空间都可编译(以及与POSIX一起工作),我开发了基本上按照你的要求做的URT 。 这是一个比实时系统轻量级的抽象级别(甚至是不一致的用户空间与内核空间RTAI函数)。