设备驱动程序是一个独立运行的程序,还是只是一个加载在内存中的库(一组函数),程序可以调用它的一个函数(所以它不是独立运行的)。
如果它是一个程序,它是否有进程 ID,例如,我可以像终止任何其他进程一样终止设备驱动程序吗?
Ste*_*itt 37
在 Linux 上,许多设备驱动程序是内核的一部分,而不是库或进程。程序使用设备文件(通常在 中/dev)和各种系统调用(例如open、read、write、ioctl...
不过也有例外。一些设备驱动程序混合使用内核驱动程序存根和用户空间库(例如使用 UIO)。其他的完全在用户空间中实现,通常在一些位碰撞接口(UART 或 GPIO)之上。在这两种情况下,它们通常都在进程中,因此您不会看到单独的进程,只会看到正在使用设备的进程。
要“终止”设备驱动程序,您必须停止所有使用它的进程,然后删除它的内核模块(假设它是作为模块构建的),以及它使用的任何其他不再需要的模块(可选)。您可以使用 列出系统上的模块lsmod,并使用rmmod或卸载它们modprobe -r,这两种方法仅在lsmod表明它们没有用户时才有效。
jdw*_*olf 10
您首先必须定义驱动程序是什么。我将其定义为控制设备(如相机)或子系统(如文件系统)的程序或子程序。它是直接通过系统程序还是通过内核服务器或用户级进程来完成,这与这个本质上的语义问题无关。
在某些情况下,Linux 仅提供用软件编写的通用协议,其中实际的“驱动程序”是设备树。那是硬件参数的配置以及构成驱动程序的要使用的软件。
一般来说,驱动程序接口和协议是使用内核模块实现的,内核模块根据设备树或 udev 规则定义的需要加载。内核模块不是严格意义上的进程或库。
库只是一组静态代码,可以加载到任何给定进程中。现代操作系统将这些库加载到共享内存中。一个进程本身可以链接到任意数量的共享库。
进程是一个正在运行的程序,系统程序或内核在其中分配了系统内存和cpu时间等资源。内核模块本身可能会也可能不会遵循这种模式,但无论如何都不会被视为 Linux 下的事实上的进程。
因此,要回答您的问题,驱动程序不必是过程,但可以是。虽然代码可以存在于库中,但驱动程序仍然通过程序加载到内存中,无论是内核模块形式的内核还是用户态进程。
在考虑驱动程序的整体实际情况时,它更像是一种语义论点。你可以说驱动程序总是一个程序,但有时它不像设备树的情况,它实际上可能是一个用户进程、设备树文件、udev 规则和内核模块,其中进程和模块都使用库来组成驱动程序的逻辑。
| 归档时间: |
|
| 查看次数: |
3966 次 |
| 最近记录: |