首页 > 系统相关 >linux系统之五 网卡驱动初始化解析

linux系统之五 网卡驱动初始化解析

时间:2023-11-05 16:11:06浏览次数:43  
标签:INTEL linux DEV 网卡 PCI 之五 VDEVICE ID E1000

一、环境说明

内核版本:Linux 3.10

内核源码地址:https://elixir.bootlin.com/linux/v3.10/source (包含各个版本内核源码,且王页可全局搜索函数)

网卡:Intel的igb网卡

网卡驱动源码目录:drivers/net/ethernet/intel/igb/

二、网卡驱动的加载

网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核。
当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。
网卡驱动程序 igb 向 Linux 内核通过 module_init 宏注册一个初始化函数 igb_init_module,当驱动加载的时候,该函数被内核调用。

// file: drivers/net/ethernet/intel/igb/igb_main.c
static struct pci_driver igb_driver = {
    .name     = igb_driver_name,
    .id_table = igb_pci_tbl, //所支持的设备列表
    .probe    = igb_probe, //探测函数
    .remove   = igb_remove,
    ......
};

static int __init igb_init_module(void)
{
    ......
    ret = pci_register_driver(&igb_driver);
    return ret;
}
module_init(igb_init_module);

igb_init_module()->pci_register_driver()->__pci_register_driver()->driver_register(),把网卡的驱动(driver)加载到内核 PCI 子系统。

三、网卡驱动的初始化

一个驱动程序可以支持一个或多个设备,而一个设备只会绑定一个驱动程序。
驱动程序将其支持的所有设备保存在一个列表 struct pci_device_id 中。
igb 驱动程序所支持的 PCI 设备列表部分如下:

// file: drivers/net/ethernet/intel/igb/igb_main.c
static DEFINE_PCI_DEVICE_TABLE(igb_pci_tbl) = {
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_1GBPS) },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_SGMII) },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_2_5GBPS) },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I211_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_FIBER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SGMII), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_FIBER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SGMII), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_FIBER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_QUAD_FIBER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_SGMII), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82580_COPPER_DUAL), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SGMII), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_BACKPLANE), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_DH89XXCC_SFP), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_NS_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_FIBER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_SERDES_QUAD), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER_ET2), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82576_QUAD_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_COPPER), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575EB_FIBER_SERDES), board_82575 },
    { PCI_VDEVICE(INTEL, E1000_DEV_ID_82575GB_QUAD_COPPER), board_82575 },
    /* required last entry */
    {0, }
};

内核通过设备 ID 与驱动支持的设备列表匹配,选择合适的驱动控制网卡,然后调用之前注册到内核 PCI 子系统的探测函数(probe)完成初始化。
例如 igb 驱动程序的 igb_probe 函数,其处理流程包括:

  1. 设置 DMA 寻址限制和缓存一致性;
  2. 申请内核内存;
  3. struct net_device 结构体的创建、初始化和注册;
  4. 注册 struct net_device_ops(里面有 igb_open)到 net_device;
  5. 注册驱动支持的 ethtool 调用函数;
  6. 注册 poll 函数到 NAPI 子系统;

igb 驱动程序中 igb_probe 函数的部分代码如下:

// file: drivers/net/ethernet/intel/igb/igb_main.c
static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
    /* 申请 DMA 内存空间和 I/O 端口 */
    err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
    /* 获取 PCIe 设备的 Resource(Memory BAR、I/O BAR 和 MSI-X BAR),并通过这些 BARs 完成一系列访问和初始化 */
    err = pci_request_selected_regions(pdev, pci_select_bars(pdev, IORESOURCE_MEM), igb_driver_name);
    /* 网络设备 */
    netdev = alloc_etherdev_mq(sizeof(struct igb_adapter), IGB_MAX_TX_QUEUES);
    /* net_device_ops 结构体,代表一个网络设备 */
    netdev->netdev_ops = &igb_netdev_ops;
    /* 注册驱动支持的 ethtool 调用函数 */
    igb_set_ethtool_ops(netdev);
    /* 函数里面注册了 poll 函数 */
    err = igb_sw_init(adapter);
}

 

四、网卡设备的启用

 

标签:INTEL,linux,DEV,网卡,PCI,之五,VDEVICE,ID,E1000
From: https://www.cnblogs.com/573583868wuy/p/17810582.html

相关文章

  • Linux下的minicom安装和使用教程
    [TOC]Linux下的minicom安装和使用教程在窗口中输入sudosu-,获取root权限test@ubuntu:~$输入sudosu-[sudo]passwordfortest:输入密码root@ubuntu:~#(获取root权限)(3)用apt-getinstallminicom,下载安装软件root......
  • linux同步机制-completion
    一、completion1.1什么是completionlinux内核中,完成量completion是一种代码同步机制。如果有一个或多个线程必须等待某个内核活动操作达到某个点或某个特定状态,那么completion完成量可以提供一个无竞争的解决方案。1.2completion的使用1.2.1定义并初始化完成量//方式一......
  • Linux第五次周总结
    第一部分X-shell怎样连接虚拟机1、双击进入软件,点击左上角的"文件",选择选项列表中的"新建"。   2、在打开的窗口界面中,输入虚拟机的相关信息,比如IP地址与端口号等。 3、并将下方中的"连接异常关闭时自动重新连接"勾选上,点击"确定"。 4、然后在弹出的警告窗口中,......
  • linux shell中 创建数组及数组的基本操作
     001、创建数组a、方法1[root@pc1test01]#ay1=(100200"abc""xyz")##创建数组 b、方法2[root@pc1test01]#ay2[0]=100[root@pc1test01]#ay2[1]=200[root@pc1test01]#ay2[3]="mn" 002、访问数组的全部元素[root@pc1test01]#ay1=(100......
  • Linux 备忘手册
    Linux备忘手册B站视频介绍:程序员Linux备忘手册来了解决学完就忘高效查询一分钟定位80%以上高频问题终于来了,耗时一个半月,修改超过10次,程序员Linux备忘手册终于来了。长图适合你在初学时挂在机房、家里或者是宿舍的墙上,随查随用。我还为大家准备了一个A4纸的手册版,这个就适......
  • Linux安装maven(详细教程)
    yuanwen:https://www.cnblogs.com/outrun/p/17708907.htmlhttps://www.cnblogs.com/outrun/p/17708907.htmlLinux安装maven(详细教程)Linux安装maven(详细教程)一、简介Maven是意第绪语,意思是“知识的积累者”,最初是为了简化JakartaTurbine项目中的构建过程。有几......
  • Linux记录(根文件系统NFS挂载失败)
    简单说明一下:我们测试跟文件系统的时候不是直接烧写到EMMC里面,这样测试效率太低了,Ubuntu的rootfs目录已经保存了根文件系统,我们只需要在开发板上通过nfs挂载Ubuntu下的rootfs目录即可。也就是说,根文件系统一直在Ubuntu下,开发板通过网络在使用这个根文件系统,这样方......
  • linux怎么查询网关信息
    linux查询网关信息方法一执行如下命令1route-n系统返回类似如下,根据Destination参数值判断并获取对应的内网与外网网关地址。方法二执行如下命令1netstat-r系统返回类似如下,根据Destination参数值判断并获取对应的内网与外网网关地......
  • liunx查看网口名称对应网卡型号(PCI地址对照)
    查看所有网络名称ifconfig-a查看对照闪灯对应网口位置ethtool-p网口名称列出所有网口型号及硬件地址lspci|grepethernet分别查看各网口名称对应硬件地址并对应上一步地址值ethtool-i网口名称......
  • [Linux系列]nmcli详解
    背景前段时间在做LVS实验的时候,网络规划和配置示非常关键的,以往在linux的系统中都是通过配置文件来配置和修改ip的,今天我们就来说一说nmcli命令配置网络。目前所有的linux系统配置网卡等信息,均已经推行Network-Manager服务去管理。nmcli是NetworkManager的......