据我所知,Linux 机器上的任何更新都不需要重新启动。然而,Windows 需要重新启动几次才能完成更新,这是可以理解的,因为硬件此时可能正在使用,并且重新启动可确保没有软件使用该驱动程序。
但是,操作系统(或以 Linux 为例)如何处理您想要更新驱动程序但当前正在使用的情况?
答案1
Linux 上的更新如果影响内核,则需要重新启动。驱动程序是内核的一部分。有时可以在不重新启动的情况下升级 Linux 上的驱动程序,但这并不经常发生:驱动程序的外围控制器在更新期间无法使用,并且新的驱动程序版本必须与正在运行的内核兼容。
将驱动程序升级到正在使用由驱动程序控制的外设的正在运行的系统需要旧驱动程序将外设保持在新驱动程序能够启动的状态。新旧驱动程序还必须管理来自客户端的连接切换。这是可行的,但很困难;困难程度取决于驾驶员驾驶的车辆。例如,在不卸载文件系统的情况下进行文件系统更新需要切换一些非常复杂的数据结构,但在硬件方面很容易处理(只需在更新之前刷新缓冲区,然后从空缓存开始)。相反,输入驱动程序只需在客户端传输打开描述符列表等,但硬件端要求新驱动程序知道外设处于什么状态,并且必须小心管理以免丢失事件。
在实时系统上更新驱动程序是操作系统开发过程中的常见做法,其中可以动态加载和卸载驱动程序,但通常不能在使用外设时进行。在 Linux 和 Windows 等操作系统上,通常不会在生产环境中更新驱动程序;我想它确实是在我不熟悉的高可用性系统上完成的。
有些驱动程序不在内核中(例如保险丝文件系统)。这使得更新它们变得很容易,而无需更新系统的其余部分,但它仍然要求驱动程序不在使用中(例如,必须卸载并再次安装 FUSE 文件系统的实例才能使用新的驱动程序版本)。
Linux确实有无需重新启动即可升级内核的机制:克斯普利采,补丁,移植物。这在技术上是困难的,因为更新版本必须在很大程度上兼容旧版本;特别是,它的数据结构必须具有完全相同的二进制布局。一些发行版提供此安全更新服务。这些功能在主线 Linux 内核中(还没有?)可用。在主线 Linux 内核上,只有当驱动程序作为模块加载并且可以卸载该模块并且新模块与正在运行的内核兼容时,才可以更新驱动程序。
答案2
我想补充 Gilles 的回答,指出与 Windows 中驱动程序在大多数情况下在安装时卸载和加载不同,在 Linux 中驱动程序安装主要包括将二进制文件和配置添加到文件系统并将它们设置为最新版本。
这意味着,与 Windows 不同,Windows 会告诉您重新启动,因为系统处于不稳定/未知状态,而在 Linux 中,您通常处于安装驱动程序之前的相同状态。
此外,在 Linux 中添加“新”驱动程序包括加载内核模块,因此添加新驱动程序时通常不需要重新启动。在 Windows 中,大多数设备都是由通用驱动程序处理的,因此在添加新设备时也会卸载驱动程序。
最后,内核没有“需要重新启动”标志,因此重新启动的建议取决于驱动程序帮助程序实用程序的开发人员,这意味着很可能存在您应该重新启动的情况,只是没有得到指示你应该这样做。