2011-12-13 166 views
6

我最近在学习linux网络驱动,我想知道如果我的主板上有许多相同类型的网卡,那么内核是如何驱动他们的?内核是否需要多次加载相同的驱动程序?我认为这是不可能的,insmod不会这么做,那么我怎么能让所有同类卡片同时工作呢?linux如何用相同的驱动程序驱动多个网卡?

关于

回答

10

每张卡(I/O地址,IRQ,...)的状态都被存储到一个驱动程序特定的结构中,该结构被直接或间接地传递给驱动程序的每个入口点,这样可以区分牌。这样,完全相同的代码可以控制不同的卡(这意味着是的,内核只保留一个驱动程序模块的一个实例,无论它控制的设备的数量是多少)。

例如,看看drivers/video/backlight/platform_lcd.c,这是一个非常简单的LCD电源驱动器。它包含一个名为platform_lcd的结构,该结构对该文件是专用的,用于存储LCD的状态(无论是否通电,以及是否挂起)。此结构的一个实例通过kzalloc(即每个LCD设备一个)在驱动程序的probe功能中分配,并使用platform_set_drvdata存储到代表LCD的平台设备中。已分配此设备的实例然后在所有其他驱动程序功能开始提取回来,它知道它正在哪个实例:

struct platform_lcd *plcd = to_our_lcd(lcd); 

to_our_lcd扩展到lcd_get_data本身扩展到dev_get_drvdata(一如果您查看include/linux/lcd.h,请与platform_set_drvdata相对应)。该功能可以知道设备的状态已被调用。

这是一个非常简单的例子,platform_lcd驱动程序不直接控制任何设备(这是推迟到平台数据中的函数指针),但添加硬件特定的参数(IRQ,I/O基地等),你会得到99%的Linux驱动程序是如何工作的。

+0

非常感谢,我知道如何在内核中添加多个相同的设备,只需增加platform_device结构的id,0,1,2等等,现在驱动程序就可以很好地检测这些设备。 – liunx

+0

对于平台设备,是的 - 您也可以将id设置为-1以指定系统中只能有一个设备实例(当打印设备名称时,Linux会忽略此ID)。请注意,platform_devices是特定的,其他总线可能以不同的方式工作,例如,通过他们的地址而不是数字来识别设备。 – Gnurou

+0

好的提示,再次感谢! – liunx

4

驱动程序代码只加载一次,但它为每张卡分配一个单独的上下文结构。通常你会看到struct pci_driver.probe函数指针。 PCI支持代码为每个卡调用一次探测功能,并且它调用alloc_etherdev为它所需的任何私有上下文分配具有空间的网络接口。

+0

非常感谢您的回复! – liunx