设备驱动程序和内核

Tim*_*Tim 6 operating-systems drivers kernel

设备驱动程序是操作系统内核的一部分,还是内核之外,或者一些是内核的一部分而另一些是内核之外的?

如果第三个是正确的,哪些设备的驱动程序通常是内核的一部分,哪些是内核之外的?

如果操作系统需要特定,我有兴趣了解 Linux (Ubuntu) 和 Windows 7。

谢谢!

Law*_*ceC 6

在 Windows 中,所有驱动程序都位于与内核不同的单独文件中。

在 Linux 中,驱动程序是一种类型的模块。您可以将所有设备驱动程序作为模块,一些内置于内核中,另一些作为模块保留,或者全部内置于内核中。您可以创建一个禁用模块加载的 Linux 内核,在这种情况下,所有预期使用的硬件都必须作为内核的一部分包含在内。

对于 Linux,您需要将引导期间需要访问的设备内置到内核中。这包括磁盘控制器驱动程序、网络驱动程序(用于网络引导)、串行端口或 VGA 控制台驱动程序(用于显示诊断消息)以及 CPU 访问这些设备所需的中间硬件的总线驱动程序(即 USB 控制器、PCIe、IDE、和/或可能的芯片组驱动程序)。

我确信 Windows 可以将驱动程序作为内核的一部分包含在内。它可能会在某些嵌入式或自定义版本的 Windows 中完成,但据我所知不是标准的 PC Windows。我实际上认为内核中有几个非常基本的驱动程序(如 VgaSave 和 Beep),但我可能是错的。

Windows 可以将某些驱动程序标记为“启动时间”驱动程序。这通常与上面标识的驱动程序属于同一类别。如果您访问安全模式,您会看到一堆驱动程序的名称滚动,这些都是启动时驱动程序。


Ric*_*lka 6

有两种方法可以解释“内核的一部分”。

内核作为磁盘上的文件启动(在启动时)。如果您在磁盘上询问,它们不是内核的一部分,而是单独的文件。现在几乎所有系统都将它们作为单独的文件。在真正古老的 UNIX 时代,添加驱动程序意味着将 .o 文件添加到内核 .o 文件并重新链接内核。

如果您的意思是“内核运行映像的一部分”,那取决于。Windows 可以做到这两点。事实上,出于性能原因,显示驱动程序在前一段时间(从 nt 3.51 到 NT4.0)从不是内核的一部分移动到内核运行映像的一部分。

操作系统设计有两大流派:

一种称为宏内核。所有操作系统内容都在单个内核运行映像中处理。Linux 和大多数 Unix 以这种方式运行。优点是速度快,内核的所有部分都可以读取内核的其他部分并使用内存读写进行通信。缺点是这会在一段时间后变得混乱,现在您需要协调使用。如果您可以故意做某事,有时您可能会意外地做某事。没有任何保护措施,您可能会遇到内核恐慌。

另一个被称为微内核(Windows NT 开始时是这样,Windows 仍然是)。理论是内核不工作,而是将工作分配给特殊代码,但代码不在内核内存空间中运行。其他代码无法触及内核内存或其他任何人的内存。好处是,与故障隔离 - 糟糕的非内核代码不能破坏内核。缺点 - 来回切换到内核模式会减慢速度。这就是为什么在 NT 4.0 中将显示驱动程序移入内核的原因,缓慢。

当然,这些都是概括,我已经有一段时间没有遵循 Windows 微内核设计了,尽管我可以相对确定 Linux 设计。

MacOSX 在技术上实际上很有趣,它使用混合微内核/宏 UNIX 内核设计。它曾经也支持旧的 OS9 二进制文件 - 将 MacOS9 中内核调用的内容转移到非内核空间。

DragonFly BSD 是 FreeBSD 的一个有趣的分支,它仍然是一个宏内核,但使用消息传递作为一种穷人隔离,并因此使内核工作更容易。