linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点

linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、自动安装Wi-Fi热点。

最近在做路由器二次开发,现在市面上卖的新设备,大多数都采用了2.5G网卡,现在各种Linux社区对新网卡的驱动都还不成熟,尤其是一些小众一点的网卡,有些低版本的Linux官方都没有对应版本的驱动,这里有个覆盖几乎市面上最新网卡驱动的方法,主要是整合各种网卡型号,安装时候自动进行安装。

在这里插入图片描述

在这里插入图片描述

例如,以我下面的这个设备为例,查看网卡型号如下:

lspci |grep -i net
02:00.0 Network controller: MEDIATEK Corp. Device 7961
03:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
04:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
05:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
06:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)

iwconfig
iwconfig: error while loading shared libraries: libiw.so.29: cannot open shared object file: No such file or directory


Linux网络设备驱动程序遵循通用的接口,设计时采用的是面向对象的方法,一个设备就是一个对象(net_device结构)。一个网络设备最基本的方法有初始化、发送和接收等。

Linux网络设备驱动程序的体系结构可以分为四层:网络协议接口层、网络设备接口层、设备驱动功能层和网络设备与媒介层,如图1所示。网络设备驱动程序最主要的工作是完成设备驱动功能层。在Linux中,所有网络设备都抽象为一个接口,这个接口提供了对所有网络设备的操作集合。由数据结构struct net_device来表示网络设备在内核中的运行情况,即网络设备接口。它既包括纯软件网络设备接口,如环路(loopback),也包括硬件网络设备接口,如以太网卡。由以dev_base为头指针的设备链来集体管理所有网络设备,该设备链中的每个元素代表一个网络设备接口。数据结构net_device中有很多供系统访问和协议层调用的设备方法,包括初始化,打开和关闭网络设备的open和stop函数,处理数据包发送的hard_start_xmit函数,以及中断处理函数等。

驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机中央处理器——CPU控制和使用设备的特殊程序,相当于硬件的接口,操作系统通过这个接口,控制硬件设备的工作。所有的硬件都要安装驱动程序,没有驱动程序的硬件是运行不了的,就像一辆有轮胎但是没有传动轴的汽车一样跑不起来,控制不了。假如某设备的驱动程序未能正确安装,便不能正常工作。

1、内核启动流程
起电:开启主机硬件电源。
固件:主板固件加载 BIOS 或 UEFI,进行硬件自检和初始化,检查系统配置是否正确。
BIOS/UEFI:BIOS 或 UEFI 开始寻找可启动介质,读取磁盘的 MBR 或 GBT 引导分区,启动 Bootloader。
Bootloader:Bootloader 执行 GRUB2 引导程序,GRUB2 通过 /boot/grub2/grub.cfg 配置文件的内容,从 /boot 目录中读取 /boot/vmlinuz-3.10.0-1160.83.1.el7.x86_64 内核文件,并加载到内存中。管理员可以通过 /boot/grub2/grub.cfg 配置文件,设置系统启动选项。
Initramfs:Kernel 启动过程中,首先加载 /boot/initramfs-3.10.0-1160.83.1.el7.x86_64.img 镜像文件,这是 initramfs(initial RAM filesystem),作为临时文件系统用于进行基本的系统初始化工作。包括加载 /usr/lib/modules/3.10.0-1160.83.1.el7.x86_64/kernel/fs/xfs 驱动程序。有了 xfs 驱动程序之后,Kernel 才可以挂载 xfs 格式的 / 根分区并访问文件。
Init 系统:Kernel 挂载根分区后,开始运行 init 或 systemd 进程,这是第一个 User Process。init 进程会读取 /etc/inittab 配置文件,根据不同的运行级别,开始启动相应的各种程序和服务。包括:各种设备驱动程序、进程管理、内存管理等系统服务。
Init 系统的入口在 linux/init/main.c start_kernel(),相当于 Kernel 的 main 函数,是 Kernel 真正的初始化流程入口,start_kerenl() 将会调用一系列的初始化函数,包括:CPU 初始化,Main Memory 初始化,Interrupt 初始化,Process Scheduling 初始化,TCP/IP Stack 初始化等,目的是最终建立起基本完整的 Linux Kernel ENV。

2、内核协议栈初始化流程
start_kernel() 过程中调用 linux/net/socket.c sock_init() 进入协议栈初始化流程。
sock_init() Socket 初始化:使用 Slab 内存分配算法创建 sk_buff 的 Cache 空间,并注册 Socket filesystem。
proto_init() 协议栈初始化:在 /proc/net/ 目录下创建各类协议文件,注册相关的协议文件操作函数。
dev_init() 网络设备初始化:
在 /proc/sys/net/ 目录下创建 Ethernet Device 和 TCP/IP Protocols 相关的数据结构文件;
开启 Device 的 Hardware Rx/Tx Interrupt;
为每个 CPU 初始化一个 Rx Queues 并绑定硬中断号,同时注册接收报文的软中断回调函数;
注册 loopback 本地回环操作函数;
inet_proto_init INET Socket 初始化:注册 INET Socket 接口函数,例如:TCP、UDP、ICMP、IGMP 等协议类型的基本收包处理函数。
unix_proto_init UNIX Socket 初始化:注册 UNIX Socket 接口函数。

3、网卡驱动程序注册流程
Driver 会调用 module_init() 向 Kernel 注册 init() 函数,然后在 dev_init() 过程中初始化 Device 和 Driver 时,Kernel 就会调用它。以 Intel I350 网卡的 IGB Driver(Intel Gigabit Ethernet)为例,它的初始化函数为 linux/drivers/net/ethernet/intel/igb/igb_main.c igb_init_module()。

IGB Driver 初始化流程的核心是 pci_register_driver(),它维护了一个 pci_device_id 映射表,通过读取 Device PCI configuration space(如下图)中的 Vendor ID 和 Device ID 来并识别出 Device 具体的型号以及对应的驱动程序。

4、网卡驱动程序初始化流程
IGB Driver 的初始化流程从 linux/drivers/net/ethernet/intel/igb/igb_main.c igb_probe() 函数开始。

dma_set_mask() 申请 DMA 内存空间和 I/O 端口。
pci_request_selected_regions() 获取 PCIe 设备的 Resource,包括:Memory BAR、I/O BAR 和 MSI-X BAR 这 3 个 Regions,并通过这些 BARs 完成一系列访问和初始化,例如更新 Linux 文件系统 /sys/bus/pci/devices/{BDF}/。
alloc_etherdev_mq() => alloc_netdev_mq():
实例化 Kernel 的 net_device(网络设备管理,包含了 Device 的详细信息)结构体和 IGB 私有的 igb_adapter(包含了 IGB Driver 的特性信息)结构体。
实例化 Kernel 的 netdev_queue(网络设备队列管理)结构体,并关联到 net_device。
初始化 net_device 实例。
设置 net_device->netdev_ops 设备操作函数集(包含了 Device 的各种操作回调函数,例如:igb_open 设备启动函数、收/发包函数等)和 net_device->ethtool_ops ethtool 操作函数集。
igb_sw_init() => igb_init_interrupt_scheme():
igb_set_interrupt_capability():设置网卡的发送队列数量、接收队列数量、中断描述符数量,调用 pci_enable_msix() 获得网络的 MSIX 中断号。并将其保存到 pci_dev->msi_list 的每一项 msi_desc.irq 中。
igb_alloc_q_vectors():根据之前设置的中断描述符个数,初始化中断描述符 igb_q_vector,并加入到 igb_adapter->q_vector[] 列表中。同时初始化 igb_q_vector 中的 napi 结构体(注册 NAPI 收包机制所必须的 poll() 函数),然后将 napi 实例挂载到 net_device->napi_list 链表中。
igb_alloc_queues():根据之前设置的发送队列个数,实例化 igb_ring 结构体,然后添加到 igb_adapter->tx_ring[] 列表中。同样的,为接收队列实例化 igb_ring 结构体,并添加到 igb_adapter->rx_ring[] 列表。
igb_map_ring_to_vector():将 Rx Ring、Tx Ring 实例和 igb_q_vector 关联起来,即:igb_q_vector->tx_ring 和 igb_q_vector->rx_ring。
igb_init_hw_timer() 设置网卡硬件定时器。
igb_probe_vfs() 设置 SR-IOV 特性,如果没有开启则将 igb_adapter->vfs_allocated_count 设置为 0。
igb_irq_disable() 关闭网卡设备的中断。
设置网卡特性标志 net_device->features 和 net_device->vlan_features。
获取 Ethernet Ports 的 MAC 地址并保存到 net_device->dev_addr 中。
register_netdev() 将新建的 net_device 实例注册到 Kernel 中。
如此的,Kernel 就掌握了 PCIe Device 的详细信息以及各类操作函数入口,并以此完成对 Device 控制。

5、创建网络接口
在 igb_probe() 的后期调用了 linux/include/linux/netdevice.h register_netdev() 将 net_device 实例注册到 Kernel 中,并会创建对应的 Network Interface。然后我们在 Shell 中就可以看见对应的网卡设备了。

register_netdev() 读取 net_device 实例提供的信息,并根据 IGB Driver 设定的 Network interface name prefix(前缀),为其生成一个唯一的 Interface name。例如:ethX(Ethernet)。

ifconfig 指令
当我们执行指令 ifconfig eth0 时,就可以查看到 net_device 实例提供的 Name、MAC、Mask、MTU 等信息。这些信息。这实际上是 ifconfig 指令通过调用 Socket I/O SCI 来实现的。

RX errors:NIC 总的收包错误数量,包括 too-long-frames 错误,Rx Ring 溢出错误,CRC 校验错误,Frame 同步错误,FIFO Overruns 错误、Missed pkg 错误等。
RX dropped:NIC 总的丢包数量,通常是由于 skb_buffer 内存空间不足导致的,表示 CPU 处理能力低于 NIC 带宽。
RX overruns:NIC 总的 FIFO Overruns 错误数量,通常是由于 CPU 无法及时处理 NIC 发出的硬件中断导致的,表示硬件中断可能没有均衡的分布在多个 CPU Cores 上。
RX frame:表示 Misaligned 的 Frames。
ethtool 指令
也可以使用 ethtool 命令行工具用于查看并 net_device 结构体的配置信息。ethtool 指令则是通过调用 ioctl I/O SCI 与 Net device 注册的 ethtool 函数进行交互来实现的。

查看 NIC 的基础信息,包括 Supported ports(TP 电口、Fiber 光口)、Supported link modes、Speed(速率)、Duplex(双工)、Link detected 等。


下载脚本:点击下载

上传到目标Linux系统,并解压,其中一个目录如图所示的目录,还有一个目录是众多网卡驱动。

在这里插入图片描述

简单两步执行:

第一步:

sh update.sh

之后设备会重启。

第二步:

sh config.sh

之后设备会重启。

到这里就完成了,有线网卡和无线网卡的驱动都自动安装好了,系统也优化配置了,如果设备有 Wi-Fi 天线,会自动配置无线网卡驱动,并自动创建Wi-Fi出来。
手机搜索发现:
Wi-Fi 账号:mitu
Wi-Fi密码:12345678

这个信息可以在第二步之前进行配置,也就是hostapd.conf文件中进行配置。


需要注意的是,再执行上面两个步骤之前,需要确保设备有网。这里建议通过手机的USB网络共享,所有手机都支持这个功能,步骤如下:

1) 目标设备开机,首先手机通过USB数据线连接设备(有些手机必须先连接数据线,才有下面的这些选项和菜单;
2) 打开手机的“设置” 功能,如下图所示;
在这里插入图片描述

3) 选择“移动网络”,如下图所示;
在这里插入图片描述

4)选择”移动网络共享“,如下图所示;
在这里插入图片描述

5)打开“USB共享网络”,完成。


提供的软件包里面包含了众多网卡型号,弄懂了脚本的内容,上面方法实测可以驱动几乎所有的网卡型号,有不懂的可以把错误提出来进行留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/117721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

crond服务

目录 一、crond服务基础知识 1、crond服务介绍 2、查看crond服务的状态 3、crond服务配置文件详解 4、额外的配置文件目录 二、crond服务基础命令 1、crond服务使用 2、 管理和操作 crond 服务 3、crond服务命令举例 一、crond服务基础知识 1、crond服务介绍 1、crond…

bug: https://aip.baidubce.com/oauth/2.0/token报错blocked by CORS policy

还是跟以前一样,我们先看报错点:(注意小编这里是H5解决跨域的,不过解决跨域的原理都差不多) Access to XMLHttpRequest at https://aip.baidubce.com/oauth/2.0/token from origin http://localhost:8000 has been blo…

HarmonyOS 数据管理与应用数据持久化(二)

通过键值型数据库实现数据持久化 场景介绍 键值型数据库存储键值对形式的数据,当需要存储的数据没有复杂的关系模型,比如存储商品名称及对应价格、员工工号及今日是否已出勤等,由于数据复杂度低,更容易兼容不同数据库版本和设备…

100量子比特启动实用化算力标准!玻色量子重磅发布相干光量子计算机

2023年5月16日,北京玻色量子科技有限公司(以下简称“玻色量子”)在北京正大中心成功召开了2023年首场新品发布会,重磅发布了自研100量子比特相干光量子计算机——“天工量子大脑”。 就在3个月前,因“天工量子大脑”在…

ModbusTcp通信(S7-1200PLC作为服务器端)

S7-200Smart plc作为ModbusTcp服务器端的通信 S7-200SMART PLC ModbusTCP通信(ModbusTcp服务器)_s7-200 modbustcp-CSDN博客文章浏览阅读2.3k次。S7-200SMART PLC 作为ModbusTCP通信(客户端)编程应用和程序详细讲解可以查看下面的博客,链接地址如下:S7-200SMART PLC Modbus…

你的停机真的优雅么?第二弹来袭 | 京东云技术团队

1. 前言 之前总结了一篇基于现有业务线在停机重启时会产生RPC和MQ调用强杀导致业务数据不一致文章,文中通过优雅停机改造对RPC服务进行反注册和MQ进行暂停消费,进而可以解决在停机时强制kill掉RPC线程或者MQ线程导致数据不一致现象,具体的原…

服务号能升级成订阅号吗

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?一、文章推送的篇数不同服务号在文章的推送篇数上是有所限制的(每月推4次)订阅号则每天可推送一篇文章。二、定义不同服务号主要是为关注用户提供服务使用的;订阅…

SQL数据库使用方法

首先打开sqlite3.exe所在文件夹,如图1 图1 在文件夹路径中将路径改为cmd,如图2所示 图2 在弹出的cmd窗口中输入如图3所示。 图3 sqlite3 tichiceliang.db 其中tichiceliang是数据库名称。然后按enter,再在cmd中输入.table,可以看到文件夹目…

一种使用wireshark快速分析抓包文件amr音频流的思路方法

解决方案: 1. 使用wireshark过滤amr,并导出原始数据文件; 2.使用ue的二进制编辑模式,编辑该文件,添加amr头,6个字节数据“#!AMR”,字节数据为 23 21 41 4D 52 0A 3.修正格式:通过抓包发现&#…

idea 将分支的代码合并到master

idea 将分支的代码合并到master 1. 首先签出到自己的分支 (自己的分支是自己写的代码,需要合并到master分支去) 2. 然后选中master分支,右键选择 签出并变基到“feature_SC” ,完成之后master分支中就已经是完整的代码了。 当…

基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

解决vue3父组件执行子组件方法报错:TypeError: Cannot read properties of null

现象: 父组件执行子组件的代码: 原因: Vue3使用的所有变量除了来自父组件传值的props以外,其他的html绑定的所有本地变量都必须通过return导出! 这一点是vue3 最坑爹的一点。很容易忘记。 解决办法:使用t…

如何在苹果Mac系统设置中查看Wi-Fi密码?

在 Mac 上查找保存的 Wi-Fi 密码的最简单方法之一是从系统设置内的高级 Wi-Fi 首选项页面。您可以通过下面的方式访问此页面来查找您保存的 Wi-Fi 密码。 1.在 Mac 上,选取「苹果菜单」选择「系统设置」。 2.从侧边栏中选择「Wi-Fi」,单击「高级」。 3.…

小程序如何设置自动预约快递

小程序通过设置自动预约功能,可以实现自动将订单信息发送给快递公司,快递公司可以自动上门取件。下面具体介绍如何设置。 在小程序管理员后台->配送设置处,选择首选配送公司。为了能够支持自动预约快递,请选择正常的快递公司&…

【Nuxt】Nuxt3 中使用 swiper 并自动滑动、手动滑动、点击滑动

demo 示例 建议先看官网 nuxt-swiper .vue 文件中使用 样式请根据你项目实际来,只展示基础配置 import { Swiper, SwiperSlide } from swiper/vue import { Autoplay } from swiper/modules import swiper/css let useSwiper: any null // swiper实例 // 初始…

【ML】分类问题

分类问题 classification:根据已知样本特征,判断输入样本属于哪种已知样本类。 常用入门案例:垃圾邮件检测、图像分类、手写数字识别、考试通过预测。 分类问题和回归问题的明显区别: 分类问题的结果是非连续型标签&#xff0c…

STM32:I²C通信原理概要

一、IIC通信原理 IIC通信和串口通信有一定的相似之处,都有一根共地线和两根数据线。但是传递外部信息,串口有两根数据线可以进行双向通信,也就是全双工通信。而在IIC通信下,其中一条数据线是用于提供同步时钟脉冲的时钟线(SCL)&am…

oracle-sql语句执行过程

客户端输入sql语句。 sql语句通过网络到达数据库实例。 服务器进程(server process)接收到sql语句。 sql – 解析成执行计划,然后sql才能执行。 会将sql和sql的执行计划缓存到共享池中。解析: 会消耗很多资源。 从数据库找数据,先从buffer cache中找&a…

STM32F4X SDIO(六) 例程讲解-SD_PowerON

STM32F4X SDIO(六) 例程讲解-SD_PowerON 例程讲解-SD_PowerONSDIO引脚初始化和时钟初始化SDIO初始化(单线模式)CMD0:GO_IDLE_STATE命令发送程序命令响应程序 CMD8:SEND_IF_CONDCMD8参数命令发送程序命令响应程序 CMD55:APP_CMDCMD55命令参数命令发送命令…

前端框架Vue学习 ——(二)Vue常用指令

文章目录 常用指令 常用指令 指令: HTML 标签上带有 “v-” 前缀的特殊属性&#xff0c;不同指令具有不同含义。例如: v-if, v-for… 常用指令&#xff1a; v-bind&#xff1a;为 HTML 标签绑定属性值&#xff0c;如设置 href&#xff0c;css 样式等 <a v-bind:href"…