![设备驱动程序和内核](https://linux22.com/image/1278343/%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%92%8C%E5%86%85%E6%A0%B8.png)
设备驱动程序是操作系统内核的一部分,还是在内核之外,或者一些是内核的一部分,而另一些在内核之外?
如果第三个是正确的,那么哪些设备的驱动程序通常是内核的一部分,哪些在内核之外?
如果需要具体说明操作系统,我有兴趣了解 Linux(Ubuntu)和 Windows 7。
谢谢!
答案1
在 Windows 中,所有驱动程序都位于单独的文件中,与内核不同。
在 Linux 中,驱动程序是一种模块。您可以将所有设备驱动程序都设置为模块,一些内置到内核中,一些保留为模块,或者全部内置到内核中。您可以创建一个禁用模块加载的 Linux 内核,在这种情况下,它预期与之配合的所有硬件都必须作为内核的一部分包含在内。
对于 Linux,您需要将启动期间需要访问的设备内置到内核中。这包括磁盘控制器驱动程序、网络驱动程序(用于网络启动)、串行端口或 VGA 控制台驱动程序(用于显示诊断消息)以及 CPU 访问这些设备所需的中间硬件的总线驱动程序(即 USB 控制器、PCIe、IDE 和/或可能的芯片组驱动程序)。
我确信 Windows 可以将驱动程序作为内核的一部分。据我所知,这可能在某些嵌入式或定制版本的 Windows 中实现,但标准 PC Windows 中不会实现。实际上,我认为从技术上讲,内核中包含几个非常基本的驱动程序(如 VgaSave 和 Beep),但我可能错了。
Windows 可以将某些驱动程序标记为“启动时”驱动程序,这些驱动程序通常与上面标识的驱动程序属于同一类别。如果您进入安全模式,您会看到一堆驱动程序的名称滚动出现,这些都是启动时驱动程序。
答案2
有两种方式可以解释‘内核的一部分’。
内核在启动时作为磁盘上的文件启动。如果您问的是磁盘上的文件,它们不是内核的一部分,而是单独的文件。现在几乎所有系统都将它们作为单独的文件。在非常古老的 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 的一个有趣的分支,它仍然是一个宏内核,但使用消息传递作为一种穷人的隔离,从而使内核工作更容易。