eri*_*ris 8 c linux linux-kernel rtai
我有一个主要用C编写的大系统,到目前为止在用户空间中运行.现在我需要将代码编译为内核模块.为此,AFAIK,我应该至少重写代码和替换功能为malloc,calloc,free,printf与内核的等同物,因为这些都是仅仅用户空间的功能.但问题是,我没有系统中使用的某些定制库的源代码,而且这些库malloc在其函数内调用等.所以,基本上,我可能需要重新实现整个库.
现在的问题是:如果我将自己的实现编写malloc为包装器kmalloc,它会是一个非常脏的黑客,如下所示:
void *malloc(size_t size) {
return kmalloc(size, GFP_USER);
}
Run Code Online (Sandbox Code Playgroud)
然后将此实现链接到系统代码,这将消除模块错误中的所有未知符号.
实际上我认为这将是一个常见的问题,而且有人已经写过这样的kmalloc包装,但是我已经在谷歌上搜索了几天而没有发现任何有用的东西.
编辑:这样做的原因是我所说的系统是在VxWorks实时操作系统上运行的实时应用程序,现在我们想将它移植到Linux RTAI上,其中应用程序主要在内核空间中运行.但我想有可能在用户空间中实时拥有,所以,我应该像迈克建议的那样,将代码分离到内核和用户空间部分,并在它们之间与共享内存进行通信.
我以前从未见过这件事.我确实有做在以前的工作类似的东西(在我们的手机,对节能的原因,我们不得不端口的代码从用户空间从内核的部分),但是这就是我做的.我花了一部分的代码和移动它,以及一小部分.
当我这样做时,我将用户空间调用更改为内核调用,原因有两个:
这种方式不那么令人困惑(其他人看着代码并不知道为什么我从内核调用"malloc")
malloc并且kmalloc不完全相同.我的意思是
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);
Run Code Online (Sandbox Code Playgroud)
显示分配的实际内存量:
[90144.702588] I got: 32 bytes of memory
Run Code Online (Sandbox Code Playgroud)
无论如何......从技术上讲,你如何描述它,应该工作正常.两者都拿a size_t并返回a void *它应该工作; 但请注意,移动到内核中的代码越多,确定性越低的事物变得越不明显,并且malloc()<=> kmalloc()不像看起来那样是1:1.