内核模块编程:端口C ++程序到内核模块

时间:2012-08-29 08:33:31

标签: linux-kernel kernel kernel-module

我正在开展一个旨在控制应该玩足球比赛的双极机器人的项目。所有程序都是用纯C ++编写的,链接各种共享库(例如OpenCV,伺服电机控制器等)。

系统性能至关重要,应该是95%的实时硬件,因此Xenomai补丁已应用于内核。遗憾的是,线程切换延迟的基准测试表明系统无法满足所有情况下的硬实时需求。二人到this work。我们可以通过将所有内容移植到内核空间来提高性能。

我从未开发过内核模块......只需阅读一些文档。似乎与常规用户空间程序不同。甚至构建系统也不同。

我的问题:是否可以将一个完全用C ++编写的常规用户空间应用程序,广泛使用共享库和POSIX线程转换为内核模块?

如果答案是否定的,我将静态重新编译所有库并使用C代替......这将是有害且耗时的过程。

1 个答案:

答案 0 :(得分:2)

首先,如果你想要硬实时,你应该使用硬实时系统,而不是Linux。 Linux可以做一些实时的事情,但不会在最后期限内推断出硬保证。

但是要回答你的问题,不,不可能将C ++应用程序变成内核模块,因为内核缺少可以实现的C ++运行时。在内核空间中,你甚至不能使用libc,更不用说libstdc ++。

静态地重新编译所有库将不会更好。首先,这意味着你最终必须将libc移植到内核空间,这是不可行的(因为libc通过系统调用调用内核本身)。此外,您通常希望保留进入内核的代码量(并在发生故障时将整个系统随之取下)尽可能小。

如果声音更像是您的应用程序需要重新设计以限制线程延迟(通过使用较轻的线程库,或通过减少线程切换的数量)。无论如何,如果你在内核中使用线程,你仍然会有延迟 - 而你可能获得的唯一好处就是没有系统调用。

所以我的猜测是你需要考虑设计而不是将内容转移到内核中。