2013-02-08 83 views
8

我有一个大的系统,主要用C语言编写,到目前为止一直在用户空间中运行。现在我需要将代码编译为内核模块。为此,AFAIK,我应该至少重写代码和替换功能作为malloccallocfreeprintf与他们的内核当量,因为这些都是仅仅用户空间的功能。但问题是,我没有系统中使用的一些定制库的源代码,这些库在它们的函数内调用malloc等。所以,基本上,我可能需要重新实现整个图书馆。将用户空间代码移植到内核空间

现在的问题:会是一个非常肮脏的黑客,如果我写我自己的实施malloc作为一个包装周围kmalloc,这样的事情:

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

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

其实我认为这将是一个普遍的问题,有人会已经写这样的kmalloc的包装,但我一直在google搜索了两天,现在,没有发现任何有用的。

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

+0

我刚刚看到[这个破解](http://stackoverflow.com/a/14728092/912144)对于gcc可能对你有用。 – Shahbaz 2013-02-08 12:32:10

+9

通常情况下,人们试图将内容从内核移出,而不是相反。我个人的经验是,如果你认为你需要制作一个你的程序的内核模块,那么你可能做错了。 – 2013-02-08 12:34:35

+0

@JoachimPileborg他可能会认为它会在内核空间更快 – Ulterior 2013-02-08 12:37:07

回答

8

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

当我做到了,我改变了用户空间调用到内核,因为一些原因两个主要的人呼叫:

  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。

0

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