我试图了解设备驱动程序如何在Linux中工作。
我具有如下设备节点(主机号89,设备名称i2c-0)
crw-r--r-- 1 0 0 89, 0 Sep 29 01:36 /dev/i2c-0
我有名称为i2c.ko
的i2c驱动程序,在启动过程中将执行insmod i2c.ko
。
并且在驱动程序中,将在初始化期间调用以下函数:
register_chrdev(89, "i2c", &i2chtv_fops)<0 // not "i2c-0"
我的问题是:当用户调用open("/dev/i2c-0", O_RDWR)
时,内核如何知道要使用哪个驱动程序?我注意到设备名称为i2c-0
,但注册的设备名称为i2c
。是因为它们使用的主号码与内核可以使用正确的驱动程序的主号码相同?
是,主要数字选择驱动程序,次要数字选择“单位”(无论是哪种形式;对于控制台驱动程序,这是不同的屏幕)。
您看到的-0
是“单元”(如果系统中有多个i2c总线,则为该单元。)>
主号码告诉您哪个驱动程序处理哪个设备文件。次要数字仅由驱动程序本身用来区分正在运行的设备,以防万一驱动程序处理多个设备。