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

亨耶

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

但是,如果要更新驱动程序但当前正在使用它,那么OS(或Linux)如何处理这种情况呢?

吉勒斯“别再邪恶了”

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

将驱动程序升级到正在使用该驱动程序控制的外围设备的运行系统时,要求旧驱动程序以新驱动程序能够启动的状态离开外围设备。新旧驱动程序也必须管理来自客户端的连接的切换。这是可行的,但是很困难。难易程度取决于驾驶员驾驶的是什么。例如,在不卸载文件系统的情况下进行文件系统更新需要移交一些非常复杂的数据结构,但是在硬件方面很容易处理(只需在更新前刷新缓冲区,然后从空缓存开始)。相反,输入驱动程序只需要在客户端发送一个打开的描述符列表等,

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

某些驱动程序不在内核中(例如FUSE文件系统)。这使更新它们变得很容易,而无需更新系统的其余部分,但是仍然需要不使用驱动程序(例如,必须卸载并重新安装FUSE文件系统的实例才能使用新的驱动程序版本)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章