2015-06-20 80 views
1

我需要编写linux内核模块,它将在屏幕上的所有其他窗口中显示消息框。我需要在内核中绘制图像,不需要从用户空间应用程序访问此图片。我不明白如何做到这一点。我应该使用什么框架 - framebuffers或v4l?我认为显示控制器的直接编程不是一个好主意,因为内核中有其他的驱动程序已经这样做了。所以,问题是:如何在内核驱动程序之间进行交互,以及如何指定我的图片应该位于最前面?屏幕显示驱动程序

我将不胜感激任何帮助。

回答

0

你不能这样做,因为内核不处理GUI,它特别不处理窗口系统。它提供了以各种形式访问视频输出设备的功能,但是屏幕的所有实际绘图和合成都是在用户空间中完成的。

现在,内核模块将有能力重写帧缓冲区,但是,正如您注意到的那样,有多个接口用于不同的目的。另外,甚至2D桌面使用3D渲染也很常见。为您的目的劫持3D命令流将会非常困难。

即使您管理了所有这些,也不能保证用户空间窗口系统不会立即覆盖您的消息框。甚至可能在它到达显示器之前。

所以不行,它不能直接从内核以任何实际的方式完成。你最好的选择是用户空间守护进程,像任何其他GUI程序一样通过标准通道代表你的内核代码显示消息。

+0

但是,为什么我不能在内核模块中实现用于用户空间应用程序的假write()处理程序,并在内核框架调用适当的回调函数时绘制真实图像?我只想在屏幕上显示所有其他东西的准备.bmp图像(如徽标)。 – alien

+0

首先,拦截一个写另一个驱动程序不应该发生,所以没有干净的方式。其次,当framebuffer是'mmap()'时可能没有写入。第三,最普遍的UI渲染可能不是基于像简单帧缓冲那样微不足道的东西。做这样的事情是一个大规模的黑客行为,需要很长时间才能实现,并可能会破坏下一个内核版本。这是不实际的。 –

+0

我需要做的就是在内核中分配我自己的缓冲区,用图像填充它,然后让显示驱动程序绘制它。与普通帧缓冲驱动程序所做的一样,不包括与用户空间应用程序的交互。我不需要任何用户空间的GUI子系统,因为我的照片应该放在屏幕的顶部。我真的不能使用内核framebuffer API来做到这一点? – alien