当前位置: 首页 > news >正文

Linux网络技术学习(六)—— 网络设备初始化(II)

文章目录

    • 初始化选项
    • 模块选项
    • 设备处理层初始化:net_dev_init
    • 用户空间辅助程序
    • kmod解析
    • 热插拔
    • 虚拟设备
    • 虚拟设备范例
    • 通过/proc文件系统调整


初始化选项

内核内建的组件以及模块加载的组件都能输入参数,使用户调整组件所实现的功能、重写默认值等

模块选项(module_param系列的宏)
使用module_param宏可以在文件系统中/sys文件夹下生成变量选项,通过这些文件在运行期间配置这些选项向内核提供这些配置选项。

引导期间内核选项(__setup系列的宏)
在引导加载程序引导期间可以提供这些定义选项。


模块选项

内核模块采用 宏的方式定义其参数。

// include/linux/moduleparam.h
#define module_param(name, type, perm)              \module_param_named(name, name, type, perm)module_param(rtw_tx_bw_mode, uint, 0644);

第一个输入参数是给用户使用的参数名称;第二参数类型(整形);第三个表示参数作为文件输出到/sys/时,分派给该文件的权限

root@linaro-alip:/sys/module/wlan/parameters# ls -l rtw_tx_bw_mode
-rw-r--r-- 1 root root 4096 Feb 14 18:58 rtw_tx_bw_mode

每个模块都在/sys/modules中分派一个目录。子目录/sys/module/对应模块/parameters中的每个文件就是该模块所输出的每个参数。组件程序员想让用户可以读取参数的值,至少必须给予读取权限。也可以提供写权限,允许用户可以修改参数的值。

/sys/中的文件和文件系统下的文件权限使用方法相同,使用拥有者权限对其修改也是可以的。


设备处理层初始化:net_dev_init

网络代码初始化的重要部分,包括流量控制和各个CPU入口队列,这个函数定义在<net/core/dev.c>

static int __init net_dev_init(void)
{
}subsys_initcall(net_dev_init);

subsys_initcall宏确保任何NIC设备驱动程序自行注册前net_dev_init会先执行

net_dev_init的主要部分:
1、由两个网络软件中断(softirq)所使用的对应各个CPU的数据结构被初始化。

    open_softirq(NET_TX_SOFTIRQ, net_tx_action);open_softirq(NET_RX_SOFTIRQ, net_rx_action);

2、当内核被编译为支持/proc文件系统时,文件会通过dev_proc_init添加到/proc

    if (dev_proc_init())goto out;

3、协议处理例程向量ptype_base初始化,用于分离入口流量的多路合并传输。


用户空间辅助程序

有些情况下,内核调用用户空间应用程序以处理事件也是可以的。这又两个重要的辅助程序:
/sbin/modprobe
  当内核需要加载模块时就会被调用
/sbin/hotplug
  当内核侦测到一个新设备已经插入或拔出系统时会被调用。主要工作是根据设备标识符加载正确的设备驱动程序。

内核提供一个名为call_usrmodehelper的函数,以执行这类用户空间辅助程序。
此函数允许调用者通过arg[ ] 传递给一些自变量,并通过env[ ] 传递一些环境变量给应用程序。
第一个自变量arg[0]通知call_usrmodehelper要启用哪个用户空间辅助程序,而arg[1]可以用于通知辅助程序该使用什么配置脚本。

两个内核函数request_moudle和kobject_hotplug如何调用call_usrmodehelper?以调用/sbin/modprobe和/sbin/hotplug。


kmod解析

kmod是内核模块加载程序,允许内核组件请求加载一个模块。内核提供的请求加载模块的函数不止一个,这里介绍request_moudle。
此函数用要加载的模块名字初始化arg[1]。/sbin/modprobe使用配置文件/etc/modprobe.conf去做各式各样的事情,其中之一就是去了解从内核所接收的模块名字实际上是否为其他模块的别名。
在这里插入图片描述
当管理员使用ifconfig配置一张设备驱动程序尚未加载的网卡
如:设备eth0,内核向/sbin/modprobe送出一个请求,以加载名称为字符串“eth0”的模块。如果/eth0/prorobe.conf(没有这个文件就是在/etc/modprobe.d文件夹下面)包含“alias eth0 3c59x”字符,则/sbin/modprobe会尝试加载模块3c59x.ko

当管理员以IPROUTE2包的tc命令配置一个设备的流量控制时,可能会涉及不在内核内的队列规则或分类器。在这种情况下,内核将回向/sbin/modprobe发送一个请求,以加载相关模块。


热插拔

Linux内核引入热插拔是为了实现消费者即插即用功能。这个功能让内核去检测可热插拔设备的插入或删除,然后通知应用层程序,给足够细节,使其在必要时加载相关联的驱动程序,或者当驱动存在时应用相关联的配置。

热插拔实际上也可在引导期间用于非可热插拔设备。无论一个设备是热插在运行中的系统上,或者在引导期间已插在系统上,用户空间辅助程序都会收到这两种情况的通知信息。用户空间应用程序再决定需要执行什么动作。

Linux系统在引导期间执行一组脚本对接口设备做初始化,包括网口设备在内。这些设备的配置会在/etc/rc.d/下的每个执行等级下都有一个目录。

当你编译内核模块时,目标文件默认放在/lib/modules/kernel_version/目录下,而kernel_version为内核版本号(如:2.6.12)。在同一目录下,有两个文件:
modules.pcimap和modules.usbmap : 内核所支持设备的PCI ID和USB ID。还包含了相关联的内核模块引用(每个设备ID都有)

当用户空间辅助程序接收到一个可热插拔设备正在插入的通知信息时,就会使用这些文件找出正确的设备驱动程序。

module.xxxmap文件的填写数据来自设备驱动程序所提供的ID向量,Vortex驱动程序会对其pci_device_id实例做初始化。因为驱动程序是针对PCI设备编写的,所以该表的内容会加入到modules.pcimap

/sbin/hotplug
Hotplug默认的用户空间辅助程序/sbin/hotplug,该脚本是Hotplug套件的一部分。
套件可以通过默认目录/etc/hotplug/和/etc/hotplug.d/中的文件进行配置。

内核会调用kobject_hotplug会把arg[0]的初值设为/sbin/hotplug,把arg[1]设为要使用的代理程序:/sbin/hotplug是一个简单的脚本,把事件的处理委托给arg[1]指定的另一个脚本。

当一块NIC添加到系统或从系统删除时,kobject_hotplug会把arg[1]的初值设为net,使得/sbin/hotplug去执行net.agent代理程序。(net.agent并不代表一种媒体或总线类型)虽然net代理程序可用于配置设备,但其他代理程序可根据设备标识符而加载正确的模块。设备标识符是由内核通过INTERFACE环境变量传入的。


虚拟设备

虚拟设备是建立在一个或多个真是设备之上的抽象。虚拟设备和真实设备之间的关联可以是多对多。
在这里插入图片描述


虚拟设备范例

Linux允许你定义多种不同的虚拟设备
绑定(bonding)

  利用这个功能,虚拟设备可以绑定一组物理设备
802.1Q
  这是一种IEEE标准,VLAN的报头扩充802.3/Ethernet帧头。
桥接
  桥接接口就是网桥的虚拟代表
别名接口
  原本这项功能的主要目的是允许单一真实的Ethernet接口横跨几个虚拟接口(eth0:0,eth0:1等等),每个接口都有自己的IP配置。
现在,由于网络代码的改进,在同一个NIC上配置多个IP地址已经不需要定义一个新的虚拟接口。然而有些情况下(特别是路由),让同一个NIC具有不同的虚拟NIC会轻松点。
普通均衡器
  这是队列规则,用于流量控制。、
接收
  因为虚拟设备都是软件对象,不需要与系统上真实资源的交互,如注册IRQ处理例程或者分配I/O端口以及I/O内存。其流量是间接获取的,来自执行这些任务的物理设备。不同类型的虚拟设备在封包接收时各有不同的行为。
外部通知信息
  内核中发生其他内核组件 对特定事件发出通知信息,对虚拟设备而言,就如同真实设备一样,有其利益所在。因为虚拟设备的逻辑是实现在真实设备之上的。真实设备对此逻辑毫无所知,因此无法把这些通知信息传出去。


通过/proc文件系统调整

/proc中的一些文件会输出内部数据结构和配置参数的值,有助于记录设备驱动程序分配了哪些资源。
在/proc/net中,可以找到由net_dev_init通过dev_proc_init和dev_mcast_init所创建的文件。
在这里插入图片描述
dev
  对每个已注册至内核的网络设备而言,会显示一些有关接收和传输的统计数据。(已接收或已传输的字节数、封包数目等)
dev_mcast
  对每个已注册至内核的网络设备而言,会显示一些由IP多播所使用的参数值。
wireless
  对每个无线设备而言,会打印出来自dev->get_wireless_stats虚拟函数所返回的无线区块中的一些参数值。(只包含无线设备)
softnet_stat
  输出有关由网络代码所用的软件中断的统计数据。

相关文章:

Linux网络技术学习(六)—— 网络设备初始化(II)

文章目录初始化选项模块选项设备处理层初始化&#xff1a;net_dev_init用户空间辅助程序kmod解析热插拔虚拟设备虚拟设备范例通过/proc文件系统调整初始化选项 内核内建的组件以及模块加载的组件都能输入参数&#xff0c;使用户调整组件所实现的功能、重写默认值等 模块选项&…...

一手教你如何搭建Hadoop基于Zookeeper的集群(5台主机)

文章目录一、设计集群图二、准备五台虚拟机2.1、下载安装文件2.2、创建虚拟机2.3、配置网络2.4、修改主机名称2.5、关闭防火墙2.6、同步时间2.7、设置/etc/hosts文件2.8、设置免密登录2.9、为后面可以主备替换安装psmisc三、安装JDK3.1、安装jdk3.2、测试jdk是否安装成功3.3、将…...

Spring Cloud是什么?怎么理解Spring Cloud?

简介Spring Cloud项目的官方网址&#xff1a;https://projects.spring.io/spring-cloud/ Spring Cloud 并不是一个项目&#xff0c;而是一组项目的集合。在 Spring Cloud中包含了很多的子项目&#xff0c;每一个子项目都是一种微服务开发过程中遇到的问题的一种解决方案。它利…...

robotframework + selenium自动化测试常见的问题

1、 插入中文数据提示 FAIL UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 92-107: ordinal not in range(25 DataBaseLibrary插入中文乱码的解决&#xff1a;修改D:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py里的co…...

2023春招java面试题及答案

2023春招java面试题及答案总结1.以下Dubbo服务负载均衡策略中&#xff0c;哪一个策略的功能是相同参数的请求总是发到同一个提供者&#xff08;&#xff09;2.如下代码&#xff1a;请问编译运行的结果是什么&#xff1f;3.给出如下代码&#xff1a;请问编译运行的结果是什么&am…...

QT+OpenGL光照

QTOpenGL光照 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 颜色 现实生活中看到的物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的颜色 太阳光能被看见的白光是多找演的的组合…...

OpenCV-PyQT项目实战(7)项目案例03:鼠标框选

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …...

vue2版本《后台管理模式》(上)

后台管理模式项目开发经验总结如下&#xff0c;希望对你们有些帮助&#xff1a; 文章目录一、app 出口位置二 、 index.js 路由配置三、package.json 文件四、 main.js 既然安装插件那就需要引入五、 跨域问题总结首先需要一个完整的v2版本的项目 vue2版本思路&#xff1a;首先…...

C++与C基础重叠部分

Cmake CPP程序开发过程 计算机硬件—>机器语言—>汇编—>cppcpp—>机器(gcc)Make(makefile)—>本地智能批处理翻译机制Cmake—>跨平台生成不同设备上的makefile进行执行 Cpp基础学习 基本知识 基本格式 #include<iostream> using namespace std;…...

神经网络基础部件-卷积层详解

前言 在全连接层构成的多层感知机网络中&#xff0c;我们要通过将图像数据展平成一维向量来送入模型&#xff0c;但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性&#xff0c;将图像数据二维矩阵送给模型中学习。 卷积神经网络(convolu…...

【计算机网络】HTTPS协议原理

文章目录一、认识HTTPS协议二、为什么要发明HTTPS三、HTTP与HTTPS的区别四、常见的加密方式1. 对称加密2. 非对称加密3. 数据摘要4. 数字签名五、HTTPS的原理探究方案1&#xff1a;只使用对称加密方案2&#xff1a;只使用非对称加密方案3&#xff1a;双方都使用非对称加密方案4…...

21岁,华科博士在读,我的赛事Top经验

Datawhale干货 作者&#xff1a;vaew&#xff0c;华中科技大学&#xff0c;博士二年级在读简介笔者vaew&#xff0c;21岁&#xff0c;现为华中科技大学机械科学与工程学院陶波教授课题组博士二年级学生。主要研究方向是基于视触融合的机器人灵巧操作。学业之余的研究兴趣包括图…...

基于ThinkPHP6.0+Vue+uni-app的多商户商城系统好用吗?

likeshop多商户商城系统适用于B2B2C、多商户、商家入驻、平台商城场景。完美契合平台自营联营加盟等多种经营方式使用&#xff0c;系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持官方旗舰店&#xff0c;商家入驻&#xff0c;平台抽佣商家独立结算&#xff…...

Linux中断

文章目录 前言一、Linux 中断介绍二、中断上文和中断下文三、中断相关函数1 获取中断号相关函数2.申请中断3.释放中断4.中断处理函数四.中断下文之 tasklet1.概念2.Linux 内核中的 tasklet 结构体:3.使用步骤4.相关函数a.初始化 tasklet结构体b.调度 taskletc.杀死 tasklet总结…...

Excel+SQL实战项目 - 餐饮业日销售情况分析仪

目录1、要完成的任务2、认识数据3、SQL数据加工4、excel形成分析仪1、要完成的任务 目标&#xff1a;结合SQL和excel实现餐饮业日销售情况分析仪&#xff0c;如下表&#xff1a; 认识分析仪&#xff1a; 切片器&#xff1a;店面 分为四部分&#xff1a;KPI 、组合图、饼图、数…...

电商导购CPS,京东联盟如何跟单实现用户和订单绑定

前言 大家好&#xff0c;我是小悟 做过自媒体的小伙伴都知道&#xff0c;不管是发图文还是发短视频&#xff0c;直播也好&#xff0c;可以带货。在你的内容里面挂上商品&#xff0c;你自己都不需要囤货&#xff0c;如果用户通过这个商品下单成交了&#xff0c;自媒体平台就会…...

Redis学习【6】之BitMap、HyperLogLog、Geospatial操作命令 (1)

文章目录前言BitMap 操作命令1.1 BitMap 简介1.2 setbit1.3 getbit1.4 bitcount1.5 bitpos[pos:position]1.6 bitop1.7 应用场景二 HyperLogLog 操作命令2.1 HyperLogLog 简介2.2 pfadd2.3 pfcount2.4 pfmerge2.5 应用场景三 Geospatial【地理空间】操作命令3. 1 Geospatial 简…...

JAVA实现心跳检测【长连接】

文章目录1、心跳机制简介2、心跳机制实现方式3、客户端4 、服务端5、代码实现5.1 KeepAlive.java5.2 MyClient.java5.3 MyServer5.4 测试结果1、心跳机制简介 在分布式系统中&#xff0c;分布在不同主机上的节点需要检测其他节点的状态&#xff0c;如服务器节点需要检测从节点…...

python3.9安装和pandas安装踩坑处理

0、先决条件&#xff1a;系统内最好先安装有gcc、libffi-devel等 1、安装包下载 https://www.python.org/downloads/source/ 2、解压安装包并上传到/usr/local/python3.9 3、打开shell cd /usr/local/python3.9要先把python3.9的所有文件复制到/usr/local/python3.9才会成功…...

2023.2.15每日一题——867. 转置矩阵

每日一题题目描述解题核心解法一&#xff1a;二维表示 模拟解法二&#xff1a;一维表示 模拟题目描述 题目链接&#xff1a;867. 转置矩阵 给你一个二维整数数组 matrix&#xff0c; 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转&#xff0c;交换矩阵…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...