字符设备、平台驱动程序和内核模块之间的区别

Difference between Character Device, Platform Driver and Kernel Module

我是 Linux 内核设备驱动程序代码的新手。 一个问题对另一个问题:两者之间的区别是:

I am writing this question because, within the same code I am examining, there are three section: one for each.

平台设备驱动程序: 平台设备驱动一般是为片上components/devices和on-chip/off-chipunspeakable/un-discoverable设备编写的。

如果有一个设备 on-chip/off-chip,它没有自我识别能力,比如 i2x 设备、基于 GPIO 线路或在线(片上)定时器等。然后此类设备需要由驱动程序识别,因为这些设备没有自我 ID 或识别自己的能力。这通常发生在总线和片上组件上。

Here is detailed explanation.

示例平台设备:i2c 设备,kernel/Documentation/i2c/instantiating-devices 状态:

基本上,所有设备驱动程序都可以分为字符,或块;基于数据交易大小。

虽然有许多子分类,如网络设备驱动程序和 X 设备驱动程序,但它们也可以带入设备中,这些设备以经过 tr 的几个字节来承载数据事务(操作)

通常,平台设备驱动程序可以放入字符设备驱动程序部分,因为它们通常涉及片上操作,用于初始化和传输几个字节,无论何时需要,但不是块(KB,MB) , GB) 的数据。

内核模块?

现在,可以将驱动程序编译(集成)到内核映像中 (zImage/bzImage/...) 或者 可以编译(关闭kernel) 是可选的可调用模块化驱动程序,它不是内核映像的一部分,而是作为 .ko(内核对象)文件 (find /lib/modules/`uname -r`/ -name "*.ko") 的文件系统的一部分,它远离内核映像,但可以插入(使用 modprobe/insmod)或根据需要删除(使用 rmmod/modprobe -r)。

另一方面,无法动态删除内置驱动程序,即使我们暂时不需要它。只要系统处于 运行,即使相应的设备处于 "not found"/"not necessary/"shutdown"),内置驱动程序将保留在内核中,因此会保留在 RAM 中,只是浪费内存 space(在 RAM 上)。

模块(或模块化驱动程序)只会在必要时从辅助存储器介入到 RAM,并且如果设备被移除或未运行则可以被移除。这样可以节省 RAM 并有助于动态分配资源。