Answers:
在Linux上,许多设备驱动程序是内核的一部分,而不是库或进程。程序使用设备文件与这些文件交互(通常在/dev
)和各种系统调用,例如open
,read
,write
,ioctl
...
但是也有例外。一些设备驱动程序混合使用内核驱动程序存根和用户空间库(例如,使用UIO)。其他一些则完全在用户空间中实现,通常在某些位撞击接口(UART或GPIO)之上。在这两种情况下,它们通常都是进程中的,因此您不会看到单独的进程,只会看到正在使用设备的进程。
要“终止”设备驱动程序,您必须停止使用该设备驱动程序的所有进程,然后删除其内核模块(假定它是作为模块构建的),以及可选地使用它不再需要的任何其他模块。您可以使用列出系统上的模块lsmod
,并使用rmmod
或卸载它们modprobe -r
,这两个模块只有在lsmod
指示没有用户的情况下才起作用。
CONFIG_MODULE_FORCE_UNLOAD
,则可以尝试rmmod -f
强制卸载正在使用/未设计为要删除的模块等。除了简单地导致内核处于不可靠状态之外,这还可以,也污染内核。
您首先必须定义驱动程序是什么。我将其定义为控制设备(如相机)或子系统(如文件系统)的程序或子例程。无论是直接通过系统程序还是通过内核服务器或用户域进程来完成它,这个本质上的语义问题都不重要。
在某些情况下,Linux仅提供以软件编写的通用协议,其中实际的“驱动程序”是设备树。这是硬件参数的配置,以及要使用的构成驱动程序的软件。
一般而言,驱动程序接口和协议是使用内核模块实现的,内核模块根据需要由设备树或udev规则定义加载。从严格意义上讲,内核模块不是进程或库。
库只是可以加载到任何给定进程中的静态代码集。现代操作系统将这些库加载到共享内存中。进程本身可以链接到任意数量的共享库。
进程是一个正在运行的程序,其中系统程序或内核已分配了资源,例如系统内存和cpu时间。内核模块本身可以遵循或不遵循这种模式,但是无论如何都不能将其视为Linux下的事实上的过程。
因此,要回答您的问题,驱动程序不必进行处理,而可以进行处理。尽管代码可以存在于库中,但是驱动程序仍然通过程序加载到Meme中,无论它是内核模块还是用户级进程形式的内核。
当考虑驱动程序的实际总数时,它更多地成为语义论点。您可以说驱动程序始终是程序,但有时与设备树不同,它实际上也可以是用户级进程,设备树文件,udev规则和内核模块,其中进程和模块都使用库来构成驱动程序的逻辑。