Linux中的设备驱动程序是程序/进程还是仅仅是库?


23

是设备驱动程序是独立运行的程序,还是仅仅是加载到内存中的库(一组函数),并且程序可以调用其功能之一(因此它不能独立运行)。

并且,如果它是一个程序,它是否具有进程ID,那么例如,我可以像终止任何其他进程一样终止设备驱动程序吗?


1
您可以使用rmmod“卸载”驱动程序,但前提是不使用该驱动程序。
pjc50

Answers:


35

在Linux上,许多设备驱动程序是内核的一部分,而不是库或进程。程序使用设备文件与这些文件交互(通常在/dev)和各种系统调用,例如openreadwriteioctl...

但是也有例外。一些设备驱动程序混合使用内核驱动程序存根和用户空间库(例如,使用UIO)。其他一些则完全在用户空间中实现,通常在某些位撞击接口(UART或GPIO)之上。在这两种情况下,它们通常都是进程中的,因此您不会看到单独的进程,只会看到正在使用设备的进程。

要“终止”设备驱动程序,您必须停止使用该设备驱动程序的所有进程,然后删除其内核模块(假定它是作为模块构建的),以及可选地使用它不再需要的任何其他模块。您可以使用列出系统上的模块lsmod,并使用rmmod或卸载它们modprobe -r,这两个模块只有在lsmod指示没有用户的情况下才起作用。


2
如果您足够勇敢,并且使用编译了内核CONFIG_MODULE_FORCE_UNLOAD,则可以尝试rmmod -f强制卸载正在使用/未设计为要删除的模块等。除了简单地导致内核处于不可靠状态之外,这还可以,也污染内核。
Ruslan

9

您首先必须定义驱动程序是什么。我将其定义为控制设备(如相机)或子系统(如文件系统)的程序或子例程。无论是直接通过系统程序还是通过内核服务器或用户域进程来完成它,这个本质上的语义问题都不重要。

在某些情况下,Linux仅提供以软件编写的通用协议,其中实际的“驱动程序”是设备树。这是硬件参数的配置,以及要使用的构成驱动程序的软件。

一般而言,驱动程序接口和协议是使用内核模块实现的,内核模块根据需要由设备树或udev规则定义加载。从严格意义上讲,内核模块不是进程或库。

库只是可以加载到任何给定进程中的静态代码集。现代操作系统将这些库加载到共享内存中。进程本身可以链接到任意数量的共享库。

进程是一个正在运行的程序,其中系统程序或内核已分配了资源,例如系统内存和cpu时间。内核模块本身可以遵循或不遵循这种模式,但是无论如何都不能将其视为Linux下的事实上的过程。

因此,要回答您的问题,驱动程序不必进行处理,而可以进行处理。尽管代码可以存在于库中,但是驱动程序仍然通过程序加载到Meme中,无论它是内核模块还是用户级进程形式的内核。

当考虑驱动程序的实际总数时,它更多地成为语义论点。您可以说驱动程序始终是程序,但有时与设备树不同,它实际上也可以是用户级进程,设备树文件,udev规则和内核模块,其中进程和模块都使用库来构成驱动程序的逻辑。


0

Linux设备驱动程序本质上是一个内核空间库。它的调用主要由高层驱动程序或使用它的用户空间进程启动。

仅有几个例外:

  • 内核线程也可以由驱动程序启动/停止,这些本质上是没有用户空间部分的进程。
  • 中断处理程序由硬件而非用户空间进程启动。

在其他系统中,例如在GNU Hurd中,驱动程序本质上是进程可以与之交互的守护程序。在Linux中,驱动程序是库。不过,这两个概念都有其优点和缺点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.