设备驱动程序是一个独立运行的程序,还是只是一个加载到内存中的库(一组函数),程序可以调用它的一个函数(因此它不是独立运行的)。
如果它是一个程序,它是否有进程 ID,那么我可以像终止任何其他进程一样终止设备驱动程序吗?
答案1
在 Linux 上,许多设备驱动程序是内核的一部分,而不是库或进程。程序使用设备文件(通常在 中/dev
)和各种系统调用(例如open
、read
、write
、ioctl
...)与这些进行交互。
但也有例外。一些设备驱动程序使用内核驱动程序存根和用户空间库的混合(例如使用UIO)。其他的则完全在用户空间中实现,通常在某些位连接接口(UART 或 GPIO)之上。在这两种情况下,它们通常都在进程中,因此您不会看到单独的进程,而只会看到正在使用该设备的进程。
要“终止”设备驱动程序,您必须停止使用它的所有进程,然后删除其内核模块(假设它是作为模块构建的),以及它使用的和不再需要的任何其他模块(可选)。您可以使用 列出系统上的模块,并使用或lsmod
卸载它们,这两种方法仅在指示它们没有用户时才起作用。rmmod
modprobe -r
lsmod
答案2
您首先必须定义什么是驱动程序。我将其定义为控制设备(如相机)或子系统(如文件系统)的程序或子例程。无论是直接通过系统程序还是通过内核服务器或用户态进程来执行此操作,对于这个本质上的语义问题来说都不应该是主要问题。
在某些情况下,Linux 仅提供用软件编写的通用协议,其中实际的“驱动程序”是设备树。这是硬件参数的配置以及使用哪些软件来组成驱动程序。
一般来说,驱动程序接口和协议是使用内核模块实现的,这些模块根据设备树或 udev 规则定义的需要加载。内核模块在最严格的意义上不是进程或库。
库只是一组静态代码,可以加载到任何给定的进程中。现代操作系统将这些库加载到共享内存中。进程本身可以链接到任意数量的共享库。
进程是一个正在运行的程序,系统程序或内核在其中分配了系统内存和CPU时间等资源。内核模块本身可能遵循也可能不遵循这种模式,但无论如何都不被视为 Linux 下的事实上的进程。
因此,要回答您的问题,驱动程序不需要是流程,但可以是。虽然代码可以存在于库中,但驱动程序仍然通过程序加载到内存中,无论它是内核模块形式的内核还是用户态进程的形式。
当考虑驱动程序的整体性实际上是什么时,它更像是一个语义论证。您可以说驱动程序始终是一个程序,但有时它与设备树的情况不同,它实际上也可能是用户态进程、设备树文件、udev 规则和内核模块,其中进程和模块都使用库来组成司机的逻辑。
答案3
Linux设备驱动程序,本质上是一个内核空间库。它的调用主要由更高级别的驱动程序或使用它的用户空间进程发起。
只有少数例外:
- 内核线程也可以由驱动程序启动/停止,这些本质上是没有用户空间部分的进程。
- 中断处理程序由硬件启动,而不是由用户空间进程启动。
在其他系统中,比如 GNU Hurd,驱动程序本质上是守护进程,进程可以与它们交互。在 Linux 中,驱动程序是库。不过,这两个概念都有其优点和缺点。