linux – 主要号码次要号码和驱动程序加载

我是初学者.我对与设备驱动程序相关的主要数字和次要数字有所了解.另外我知道可以插入Linux系统的大多数设备都有一个主要数字.并且基于该主要编号,加载相应的驱动程序.
我有这个疑问,请告诉我内核在插入时如何从设备中读取主要数字?
请解释从设备插件到驱动程序加载的步骤,尽可能简单.

提前致谢.

最佳答案
主要/次要编号用于块和字符设备.

您没有从设备中检测到主号码.也许您认为USB设备可以通信设备号而Linux使用这些设备号,但USB供应商/产品ID与主要数字无关.如果将完全愚蠢的串行设备插入串口怎么办?内核无法知道你插入/拔出了什么东西.

因此,如果你想要一个主要设备的主号码,你可以使用

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

像NKamrath说,或者你使用绝对的.但请注意,many are reserved.

据我所知,以下是您要求的步骤:

>您将一些块/字符设备插入某个总线.
>根据总线(USB,PCI,PCI Express,SCSI,I²C等),总线(可能)发送一个中断信号,该信号将在一天或一天​​内到达CPU,从而到达Linux.
>中断例程在知道总线类型及其内部机制的情况下完成必要的工作,为该器件加载适当的驱动程序(如果它存在,并且确实存在)并执行其初始化函数.
>设备驱动程序的初始化函数寄存器(例如register_chrdev_region)是一个主要编号,如果它有一个保留(参见这个着名的reserved list);否则它要求内核为它分配一个(例如alloc_chrdev_region);司机还会为这名司机预留一个次要区域.
>驱动程序设置一些回调(打开/关闭/读/写)并要求内核将它们与设备号相关联.

此时,您可以使用其设备号与驱动程序通信,但如何? / dev中没有任何东西……一种方法是在你知道主要/次要对的时候使用mknod进行通信.你会发:

# mknod /dev/mydevice c 232 4

…这是:请在/ dev / mydevice创建一个设备节点,该节点链接到具有主要232和次要4的字符(c)设备.但是,您如何知道这些数字呢?它们可能是绝对的(保留列表),也可能是驱动程序打印它,因此您可以手动执行.

但这里有更好的东西.

仍在设备驱动程序的初始化函数中:驱动程序将设备注册为Sysfs设备(请参阅device_create).这会将设备放入/ sys树,其节点(目录)将有一个名为uevent的文件.如果你捕捉它,它会输出类似的东西

MAJOR=232
MINOR=4
DEVNAME=whatever

试试吧:

$cat /sys/class/tty/console/uevent

它匹配吗

$ls -l /dev/console

现在,udev是负责管理/ dev的用户空间程序.总的来说,它只是扫描/ sys树以自动填充/ dev.您可能还会看到所有主要/次要的字符和块设备,如下所示:

$ls /sys/dev/char
$ls /sys/dev/block

就是这样.如果你想更好地理解这一切,请开发一个虚拟驱动程序并尝试将其自动显示在/ dev中.

转载注明原文:linux – 主要号码次要号码和驱动程序加载 - 代码日志