linux-kernel – linux如何使用相同的驱动程序驱动多个网卡?

linux-kernel – linux如何使用相同的驱动程序驱动多个网卡?,第1张

概述我最近正在学习 linux网络驱动程序,我想知道如果我的主板上有很多相同类型的网卡,内核如何驱动它们呢?内核是否需要多次加载相同的驱动程序?我认为这是不可能的,insmod不会这样做,所以如何让所有同类卡同时工作? 问候 每个卡的状态(I / O地址,IRQ,……)存储在一个特定于驱动程序的结构中,该结构直接或间接地传递给驱动程序的每个入口点,这样可以区分卡.这样,相同的代码可以控制不同的卡(这意 我最近正在学习 linux网络驱动程序,我想知道如果我的主板上有很多相同类型的网卡,内核如何驱动它们呢?内核是否需要多次加载相同的驱动程序?我认为这是不可能的,insmod不会这样做,所以如何让所有同类卡同时工作?

问候

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

例如,看看drivers / vIDeo / backlight / platform_lcd.c,这是一个非常简单的LCD电源驱动器.它包含一个名为platform_lcd的结构,该结构对于该文件是专用的,并且存储LCD的状态(它是否被供电,以及它是否被暂停).这种结构的一个实例通过kzalloc在驱动程序的探测功能中分配 – 即每个LCD设备一个 – 并使用platform_set_drvdata存储到代表LCD的平台设备中.然后,在所有其他驱动程序函数的开头提取已为此设备分配的实例,以便它知道它正在处理的实例:

struct platform_lcd *plcd = to_our_lcd(lcd);

to_our_lcd扩展为lcd_get_data,如果查看include / linux / lcd.h,它本身会扩展为dev_get_drvdata(platform_set_drvdata的对应物).然后,该函数可以知道已调用设备的状态.

这是一个非常简单的示例,platform_lcd驱动程序不直接控制任何设备(这被推迟到平台数据中的函数指针),但添加了特定于硬件的参数(IRQ,I / O库等)和您了解linux中99%的驱动程序是如何工作的.

总结

以上是内存溢出为你收集整理的linux-kernel – linux如何使用相同的驱动程序驱动多个网卡?全部内容,希望文章能够帮你解决linux-kernel – linux如何使用相同的驱动程序驱动多个网卡?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存