什么时候应该编写Linux内核模块?

时间:2020-03-06 14:52:41  来源:igfitidea点击:

出于某种原因,有些人希望将代码从用户空间移至Linux的内核空间。很多时候,原因似乎是代码应该具有特别高的优先级,或者仅仅是"内核空间更快"。

这对我来说似乎很奇怪。我什么时候应该考虑编写内核模块?有一套标准吗?

我如何激励将代码保存在(我相信)属于用户空间的用户空间中?

解决方案

我不确定这个问题是否正确。将事物移至内核空间应该有充分的理由。如果没有任何原因,请不要这样做。

一方面,调试变得更加困难,并且错误的影响变得更糟(崩溃/死机,而不是简单的coredump)。

内核中运行的代码以与用户空间代码不同的方式访问内存,外围设备和系统功能,因此具有更高的效率。更不用说减少的内核代码安全性限制。但是,所有这些通常都需要付出一定的代价,例如增加了将内核开放给安全威胁的可能性,锁定了操作系统,使调试复杂化等等。

将内容放入内核的原因非常有限。如果我们正在编写设备驱动程序,那没关系。任何标准应用程序:从不。

缺点是巨大的。调试变得更加困难,错误变得更加频繁且难以发现。我们可能会损害安全性和稳定性。我们可能不得不更频繁地适应内核更改。无法移植到其他UNIX OS。

我最接近内核的是一个自定义文件系统(后台使用mysql),甚至为此我们使用了FUSE(U代表用户空间)。

作为一般规则。考虑一下我们想知道的内容,如果我们在操作系统开发书或者类中会看到这些内容,那么它就有很大的机会属于内核。如果不是,请将其保留在内核之外。如果我们有充分的理由违反该规则,请确保我们将有足够的知识来自己了解该规则,或者我们将与拥有该知识的人一起工作。

是的,听起来可能很刺耳,但这正是我的意思,如果我们不知道,那么几乎可以肯定答案是否定的,不要在内核中这样做。将开发转移到内核空间会打开一大堆蠕虫,我们必须确保它们能够处理。

经验法则:尽最大努力将代码保留在用户空间中。如果我们认为无法做到,那么请花与编写代码相同的时间(即很长的时间)来研究内核代码的替代方法,然后再次尝试在用户空间中实现它。如果仍然不能,请进行更多研究以确保我们做出正确的选择,然后非常谨慎地进入内核。就像其他人所说的那样,在极少数情况下要求编写内核模块,调试内核代码可能会非常麻烦,因此请不惜一切代价避免打扰。

至于在考虑编写内核模式代码时应检查的具体条件,请注意以下几点:它是否需要访问极低级的资源(例如中断)?代码是否为无法在当前导出的功能之上构建的硬件定义了新的接口/驱动程序?代码是否需要访问未导出到内核空间之外的数据结构或者原语?我们是否正在编写主要由其他内核子系统(例如调度程序或者VM系统)使用的内容(即使在这里,也不一定非要子系统采用内核模式:Mach对用户模式虚拟内存分页器具有强大的支持,因此绝对可以做到)?

如果员工确实希望获得较高的优先级,确定性,低延迟等,那么正确的选择是使用某些实时版本的Linux(或者其他OS)。

还要查看可抢占的内核选项等。确切地,我们应该做什么取决于要求,但是,除非直接与某些硬件接口,否则将代码放入内核模块中不太可能是正确的解决方案。

如果只需要较低的延迟,较高的吞吐量等,那么购买速度更快的计算机可能比开发内核代码便宜。

内核模块可能会更快(由于较少的上下文切换,较少的系统调用开销和较少的中断),并且肯定会以很高的优先级运行。如果要将少量相当简单的代码导出到内核空间中,则可以。也就是说,如果发现一小段代码对性能至关重要,并且这种代码类型可以从置于内核模式中受益,则可以将其放在那里。

但是除非将所有其他选项都用尽,否则应避免将程序的大部分移至内核空间。除了这样做的困难之外,性能收益不太可能很大。

基本上,我同意rpj。除非确实需要,否则代码必须位于用户空间中。

但是,为了强调问题,请问哪种情况?

有人声称驱动程序必须在内核中,这是不正确的。一些驱动程序对时间不敏感,实际上很多驱动程序都是这样的。

例如,成帧器,RTC计时器,i2c设备等。这些驱动程序可以轻松移至用户空间。甚至有些文件系统是在用户空间中编写的。

我们应该移至内核空间所在的地方,例如。用户内核交换,使代码无法正常工作。

但是有很多方法可以解决这个问题。例如,/ dev / mem提供了一种访问物理内存的好方法,就像从内核空间进行操作一样。

当人们谈论使用RTOS时,我通常会持怀疑态度。
如今,处理器是如此强大,以至于在大多数情况下,实时性都可以忽略不计。

但是,即使是说,我们正在使用SONET,并且我们需要在50毫秒内进行保护切换(实际上甚至更少,因为50毫秒的约束适用于整个环网),如果我们硬件支持它。

如今,许多成帧器可以为我们提供硬件支持,从而减少我们需要执行的写操作次数。工作基本上是尽可能快地响应中断。 Linux一点也不差。即使我正在运行大量其他中断(例如,IDE,以太网等),我得到的中断延迟也不到1毫秒。

而且,如果这还不够,那么硬件设计可能是错误的。有些事情最好留在硬件上。当我说硬件时,我指的是ASIC,FPGA,网络处理器或者其他高级逻辑。

如果我们提出这样的问题,那么我们不应该进入内核层。基本上,只是想知道就意味着我们不需要。上下文切换的时间可以忽略不计,以至于这些天都变得无关紧要了。