我知道驱动程序是一个可以与硬件通信以控制连接到计算机的设备的软件。而内核模块是一小段可以插入内核以提高内核性能的代码。我想问驱动程序如何与内核一起工作,设备驱动程序和内核模块之间的主要区别是什么,以及它们如何工作?
答案1
呜呜呜......
内核模块是非常具体的东西:在核心内核启动后,作为模块(即动态)加载的内核的一部分。那可以是任何东西。
为了使用硬件,您需要一些位于主要内核中的部分,原因有两个:
- 为了能够执行在用户空间中无法完成或不切实际的硬件操作,或者能够将状态保持在进程范围之外。
- 因为在用户空间中这样做真的非常低效
为了管理大多数硬件,您需要一个内核空间对应项。它可以编译为内核的一部分,也可以编译为稍后按需加载的模块。对于模块,我们无法加载所有模块。
但模块不必仅与硬件相关。有些模块只是添加功能,例如 ipv6、防火墙选项等。
另一方面,驱动程序通常提供对硬件的轻松访问。它通常包含所有特定于硬件的东西并公开通用的 API。我所说的通用是指足够通用但不一定是全球或标准的东西。例如,ATI 显卡的驱动程序将公开所有 ATI 卡的通用 API,但它可能与其他卡不同。
驱动程序可以在用户空间、内核(内置或模块)中制作,也可以在两端都有分支。例如,现在的显卡驱动程序一部分位于内核,一部分位于用户空间(例如 X 服务器、DRI 等)
答案2
模块只是一堆可以加载到 Linux 中的代码。
在 Linux 中:- 通常,模块是设备驱动程序(即,驱动某些特定硬件(设备)的软件)。但是,有些驱动程序和模块不驱动硬件。例如,某些 Linux 系统可能将 IPv6 支持作为可加载模块。或者文件系统(例如 ISO-9660)可以是驱动程序或模块。
更多细节:-
http://www.cs.umsl.edu/~sanjiv/classes/cs5780/lectures/kernel.pdf