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

news2024/10/7 20:25:51

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.coloradmin.cn/o/1167608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源,需要配置pubspec.yaml,将本地的静态资源添加到assets下面: 然后在flutter引入这些静态资源: Image.asset("images/squick.png") 就可以在app中看到这个图片了: 也可以使用网…

vue使用Web Speech API实现语音播报

SpeechSynthesisUtterance对象用于表示要播放的语音内容,SpeechSynthesis对象则用于控制语音的播放、暂停、停止等操作。 const synth window.speechSynthesis const msg new SpeechSynthesisUtterance() // 语音播放 const playVoice (text) > {synth.canc…

双热点机制结合。5+铜死亡+铁死亡相关基因生信思路

今天给同学们分享一篇结合铜死亡和铁死亡相关基因预测肿瘤预后、免疫和药敏的生信文章“A novel signature of combing cuproptosis- with ferroptosis-related genes for prediction of prognosis, immunologic therapy responses and drug sensitivity in hepatocellular car…

如何翻译SCI论文, 中译英哪里比较专业?

众所周知,SCI论文是被科学引文索引(SCI)收录的期刊上发表的论文。SCI论文是学术界内具有较高影响力和引用率的文章,通常被高度认可和重视。因此,SCI论文翻译对译员的要求很高。那么,如何翻译SCI论文, 中译英哪里比较专…

Oracle-执行计划

执行计划生成的几种方式 1. EXPLAIN FOR 语法: EXPLAIN PLAN FOR SQL语句SELECT * FROM TABLE(dbms_xplan.display());优点: 无需真正执行SQL 缺点: 没有输出相关的统计信息,例如产生了多少逻辑读、物理读、递归调用等情况无法判…

【考研数据结构代码题2】删除单链表倒数第n个结点

题目:删除单链表倒数第n个结点 难度:★ 算法思路: 首先题目没有指明链表的长度,多以首先需要编写一个函数getLength()来求表长,其次删除倒数第n个结点,即删除正数第length-n1个结点,这是二者之间…

章鱼网络进展月报 | 2023.10.1-10.31

章鱼网络大事摘要 1、Louis 成功竞选 NDC 的 HoM 议席,将会尽最大努力推动 NEAR 变革。2、章鱼网络受邀参加在土耳其主办的 Cosmoverse2023,分享 Adaptive IBC 的技术架构。3、2023年10月8日章鱼日,是章鱼网络主网上线2周年的纪念日。 …

WebDAV之π-Disk派盘 + Smart File Manager

推荐一款超级文件管理器手机版。不仅可以自建热点分享,还可以用电脑查看和下载手机上的文件,支持连接云盘服务。 Smart File Manager是一款简洁、强大、小巧完美的文件管理应用程序,它能自动识别用户内部存储器中所有的文件信息,包括音乐、视频、图片、APK、下载、文件、压…

【计算机网络】数据链路层——以太网协议

目录 1.完整的数据传输流程2.以太网以太网通信原理以太网帧格式MAC地址对比MAC地址和IP地址MTU 3.ARP协议ARP协议的作用ARP协议的格式ARP协议的原理 1.完整的数据传输流程 IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送…

欧洲爆火的Vinted是什么平台?值得入驻吗?如何入驻?

近年来,Vinted已经成为欧洲最受欢迎的在线二手服装买卖市场之一。该平台因其用户友好的界面、丰富的商品选择以及在用户之间创建的社区感而备受关注。在本文中,我们将更详细地了解Vinted的运作方式以及您开始出售商品需要知道的内容。 一、什么是Vinted&…

[动态规划] (四) LeetCode 91.解码方法

[动态规划] (四) LeetCode 91.解码方法 91. 解码方法 题目解析 (1) 对字母A - Z进行编码1-26 (2)11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 (3) 0n不能解码 (4) 字符串非空,返回解码方法的总数 解题思路 状态表示 dp[i]:以i为结…

接口自动化测试难点:数据库验证解决方案 百分之90人不知道

接口自动化中的数据库验证:确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环,而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码,帮…

蓝桥杯:买不到的数目

对于两个互质的正整数 n , m n,m n,m,请找出来不能被 n n n和 m m m组成的最大数 X X X 例如:对于4,7那么 X X X17,因为对于大于17的任一数都可由4和7组成。 重新翻译题目: 对于任一大于 X X X的正整数 Y Y Y满足 Y a n b m Y a \times nb \times m …

Java自学第1课:安装JDK+Eclipse

1 引言 在学习前,我想说一句,那就是为什么要学习Java。 每个人的出发点都不同,对于做信息化的工程技术人员来说,java不懂,就没法干项目。 尽管有c和matlab等基础,但java看起来与这些语言都不太一样。 做…

大语言模型?生成式AI?分不清楚的话可以看aws这个例子

大语言模型和生成式AI有什么紧密联系呢?为什么大语言模型近期受到如此大的关注呢?当提到大语言模型,大家可能首先会想到像ChatGPT这样的自然语言处理工具。那么大语言模型究竟是什么?它和生成式AI又存在怎样的关系呢?接…

c++获取和设置环境变量

这个功能非常常用,但是容易忘记,这里做个记录。 注意,设置的环境变量只在当前进程中生效,所以在电脑中的环境变量设置区域看不到。 std::string env getenv("PATH");env "X:\\envtest";std::string newEnv…

【Midjourney入门教程3】写好prompt常用的参数

文章目录 1、图片描述词(图片链接)文字描述词后缀参数2、权重划分3、后缀参数版本选择:--v版本风格:--style长宽比:--ar多样性: --c二次元化:--niji排除内容:--no--stylize--seed--tile、--q 4、…

AD1255/AD1256硬件SPI开发实战与跳坑过程

AD1255/AD1256硬件SPI开发实战与跳坑过程 以上图片我们可以知道在t17阶段,数据是不能被读取的。另外最小是16个τCLKIN,具体是多少这个跟你配置的DATA_rate的设置有关系。 1.6 同步SYNC的时序 要同步SYNC,要么采用管脚SYNC,要么…

Android 复杂UI界面分模块解耦的一次实践

一、复杂UI页面开发的问题 常见的比较复杂的UI界面,比如电商首页,我们看看某电商的首页部分UI: 上面是截取的首页部分,如果这个首页如果不分模块开发会遇到哪些问题? 开发任务不方便分割,一个人开发的话周…