有些人出于某种原因想要在Linux中将代码从用户空间移动到内核空间。很多时候,原因似乎是代码应该具有特别高的优先级,或者只是“内核空间更快”。
这对我来说很奇怪。我什么时候应该考虑编写内核模块?是否有一套标准?
我如何激励在(我相信)属于那里的用户空间中保存代码?
答案 0 :(得分:20)
经验法则:尝试使用绝对最佳将代码保存在用户空间中。如果你不认为可以,花费尽可能多的时间研究内核代码的替代品,就像编写代码一样(即:很长一段时间),然后再试一次在用户空间中实现它。如果仍然不能,请进行更多研究以确保您做出正确的选择,然后非常谨慎地进入内核。正如其他人所说的那样,极少有情况决定编写内核模块和调试内核代码可能非常糟糕,所以不惜一切代价明确指出。
对于在考虑编写内核模式代码时应该检查的具体条件,这里有几个:它是否需要访问极低级别的资源,例如中断?您的代码是否定义了一个新的接口/驱动程序,用于不能在当前导出的功能之上构建的硬件?您的代码是否需要访问未从内核空间导出的数据结构或基元?您是在编写主要由其他内核子系统使用的内容,例如调度程序或VM系统(即使在这里,子系统并非完全必须是内核模式:Mach强大支持用户模式虚拟内存寻呼机,所以绝对可以做到)?
答案 1 :(得分:18)
将内容放入内核的原因非常有限。如果您正在编写设备驱动程序,那就没关系。任何标准应用:永远不会。
缺点是巨大的。调试变得更难,错误变得更加频繁且难以找到。您可能会危及安全性和稳定性。您可能必须更频繁地适应内核更改。无法移植到其他UNIX操作系统。
我最接近内核的是一个自定义文件系统(后台有mysql),甚至我们也使用了FUSE(U代表用户空间)。
答案 2 :(得分:8)
我不确定问题是否正确。将内容移动到内核空间应该是一个很好的理由。如果没有任何理由,请不要这样做。
首先,调试变得更加困难,并且错误的影响更加严重(崩溃/恐慌而不是简单的coredump)。
答案 3 :(得分:3)
内核中运行的代码以与用户空间代码不同的方式访问内存,外围设备,系统功能,因此能够提高效率。更不用说内核代码的安全限制减少了。但是,所有这些通常都需要付出代价,例如增加打开内核以抵御安全威胁的可能性,锁定操作系统,使调试复杂化等等。
答案 4 :(得分:3)
基本上,我同意rpj。代码必须在用户空间,除非它真的是必要的。
但是,要强调你的问题,哪个条件?
有些人声称驱动程序必须在内核中,这是不正确的。有些司机不是时间敏感的,事实上很多司机都是这样的。
例如,成帧器,RTC计时器,i2c设备等。这些驱动程序可以轻松移动到用户空间。甚至有一些文件系统是用用户空间编写的。
你应该移动到开销的内核空间,例如。用户内核交换,使代码无法正常工作。
但是有很多方法可以解决这个问题。例如,/ dev / mem提供了一种访问物理内存的好方法,就像从内核空间那样。
当人们谈论转向RTOS时,我通常会持怀疑态度。 如今,处理器非常强大,大多数时候,实时方面都可以忽略不计。
但即便如此,让我们说,你正在处理SONET,你需要在50ms内进行保护切换(实际上甚至更少,因为50ms约束适用于整个环),你仍然可以非常快速地进行切换,如果您的硬件支持它。
如今,很多成帧器都可以为您提供硬件支持,从而减少您需要执行的写入量。你的工作基本上是尽快响应中断。 Linux也不差。我得到的中断延迟小于1ms,即使我有大量其他中断正在运行(例如IDE,以太网等)。
如果仍然不够,那么你的硬件设计可能就错了。有些事情最好留在硬件上。当我说硬件时,我指的是ASIC,FPGA,网络处理器或其他高级逻辑。
答案 5 :(得分:1)
如果你的员工想要真正的高优先级,确定性,低延迟等,正确的方法是使用一些实时版本的Linux(或其他操作系统)。
另请参阅可抢占的内核选项等。您应该做什么取决于要求,但是将代码放在内核模块中可能不是正确的解决方案,除非您直接连接某些硬件。
答案 6 :(得分:0)
作为一般规则。想想你想知道什么,如果这是你在操作系统开发书或类中看到的东西,那么它很有可能属于内核。如果没有,请将其保留在内核之外。如果你有充分的理由违反这条规则,请确保,你将有足够的知识自己了解它,或者你将与拥有这些知识的人合作。
是的,可能听起来很刺耳,但这正是我的意思,如果你不知道,那么几乎可以肯定答案是否定的,不要在内核中做到。将您的开发转移到内核空间会打开一大堆蠕虫,您必须确保能够处理这些蠕虫。
答案 7 :(得分:0)
不将代码移入内核空间的另一个原因是,当您在生产或商业环境中使用它时,由于GPL协议,您必须发布该代码。许多软件公司不想进入的情况。 :)
答案 8 :(得分:-1)
如果您只需要更低的延迟,更高的吞吐量等,购买速度更快的计算机可能更便宜,而不是开发内核代码。
内核模块可能更快(由于较少的上下文切换,较少的系统调用开销和较少的中断),并且当然执行以非常高的优先级运行。如果要将少量相当简单的代码导出到内核空间中,这可能没问题。也就是说,如果发现一小段代码对性能至关重要,和就是那种可以从内核模式中获益的代码,那么将它放在那里可能是合理的。
但是应该避免将程序的大部分内容移动到内核空间中,除非所有其他选项都已完全耗尽。除了这样做的困难之外,性能优势不太可能非常大。
答案 9 :(得分:-4)
如果您提出这样的问题,那么您不应该转到内核层。基本上只是想知道你不需要的意思。上下文切换的时间可以忽略不计,以至于无论如何它都无关紧要。