liu*_*unx 6 linux-device-driver linux-kernel
我最近正在学习linux网络驱动程序,我想知道如果我的主板上有很多相同类型的网卡,内核如何驱动它们呢?内核是否需要多次加载相同的驱动程序?我认为这是不可能的,insmod不会这样做,所以如何让所有同类卡同时工作?
问候
Gnu*_*rou 10
每个卡的状态(I/O地址,IRQ,......)存储在一个特定于驱动程序的结构中,该结构直接或间接地传递给驱动程序的每个入口点,这样可以区分卡.这样,相同的代码可以控制不同的卡(这意味着是的,内核只保留驱动程序模块的一个实例,无论它控制的设备数量是多少).
例如,看一下drivers/video/backlight/platform_lcd.c,这是一个非常简单的LCD电源驱动器.它包含一个称为platform_lcd该文件专用的结构,并存储LCD的状态(是否有电源,以及它是否被挂起).该结构的一个实例被分配在probe驱动器的功能中kzalloc- 即,每个LCD设备一个 - 并且存储到代表LCD使用的平台设备中platform_set_drvdata.然后,在所有其他驱动程序函数的开头提取已为此设备分配的实例,以便它知道它正在处理的实例:
struct platform_lcd *plcd = to_our_lcd(lcd);
Run Code Online (Sandbox Code Playgroud)
to_our_lcd如果你看一下,扩展到lcd_get_data它本身扩展为dev_get_drvdata(platform_set_drvdata的对应物)include/linux/lcd.h.然后,该函数可以知道已调用设备的状态.
这是一个非常简单的示例,并且platform_lcd驱动程序不直接控制任何设备(这被推迟到平台数据中的函数指针),但是添加了特定于硬件的参数(IRQ,I/O库等)并且您得到了如何在Linux中99%的驱动程序工作.