linux 驱动程序更新如何工作?

7 linux drivers upgrade

据我所知,Linux 机器上的更新不需要重新启动。然而,Windows 需要重新启动几次才能完成更新,这是可以理解的,因为此时硬件可能正在使用中,并且重新启动可确保没有软件使用该驱动程序。

但是操作系统(或以 linux 为例)如何处理您想要更新驱动程序但当前正在使用的情况?

Gil*_*il' 9

如果 Linux 上的更新影响内核,则需要重新启动。驱动程序是内核的一部分。有时可以在不重新启动的情况下在 Linux 上升级驱动程序,但这种情况并不经常发生:驱动程序的外围控制器在更新期间无法使用,并且新的驱动程序版本必须与正在运行的内核兼容。

将驱动程序升级到正在使用由驱动程序控制的外设的运行系统需要旧驱动程序将外设保持在新驱动程序能够启动的状态。新旧驱动程序还必须管理来自客户端的连接切换。这是可行但困难的;难度取决于司机开什么车。例如,不卸载文件系统的文件系统更新需要切换一些非常复杂的数据结构,但在硬件方面很容易处理(只需在更新前刷新缓冲区,然后从空缓存开始)。相反,输入驱动程序只需要在客户端传输一个打开的描述符列表等,

在实时系统上更新驱动程序是在操作系统上开发期间的常见做法,在操作系统上可以动态加载和卸载驱动程序,但通常不是在使用外围设备时。在 Linux 和 Windows 等操作系统上,通常不会在生产中更新驱动程序;我想它确实是在我不熟悉的高可用性系统上完成的。

某些驱动程序不在内核中(例如FUSE文件系统)。这使得在不更新系统其余部分的情况下轻松更新它们,但它仍然要求驱动程序不在使用中(例如,必须卸载并重新安装 FUSE 文件系统的实例以使用新的驱动程序版本)。

Linux 确实具有无需重新启动即可升级内核的机制:KspliceKpatchKGraft。这在技术上是困难的,因为更新版本必须在很大程度上兼容旧版本;特别是,它的数据结构必须具有完全相同的二进制布局。一些发行版为安全更新提供此服务。这些功能(还?)在主线 Linux 内核中不可用。在主线 Linux 内核上,只有当驱动程序作为模块加载并且模块可以卸载并且新模块与正在运行的内核兼容时,才能更新驱动程序。


Did*_*hen 7

我想补充一下 Gilles 的回答,指出与在大多数情况下在安装时卸载和加载驱动程序的 Windows 不同,在 Linux 中安装驱动程序主要包括将二进制文件和配置添加到文件系统并将它们设置为最新版本。

这意味着不像在 Windows 中因为系统处于不稳定/未知状态而告诉您重新启动,在 Linux 中大多数情况下您只是处于安装驱动程序之前的相同状态。

此外,在 Linux 中添加“新”驱动程序包括加载内核模块,因此添加新驱动程序时通常不需要重新启动。在 Windows 中,大多数设备由通用驱动程序处理,因此在添加新设备时也会卸载驱动程序。

最后,内核没有“需要重启”标志,因此重启的建议取决于驱动程序助手实用程序的开发人员,这意味着很可能存在您应该重启的情况,只是您没有得到指示你应该这样做。