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)
文章目录初始化选项模块选项设备处理层初始化:net_dev_init用户空间辅助程序kmod解析热插拔虚拟设备虚拟设备范例通过/proc文件系统调整初始化选项 内核内建的组件以及模块加载的组件都能输入参数,使用户调整组件所实现的功能、重写默认值等 模块选项&…...
一手教你如何搭建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项目的官方网址:https://projects.spring.io/spring-cloud/ Spring Cloud 并不是一个项目,而是一组项目的集合。在 Spring Cloud中包含了很多的子项目,每一个子项目都是一种微服务开发过程中遇到的问题的一种解决方案。它利…...
robotframework + selenium自动化测试常见的问题
1、 插入中文数据提示 FAIL UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 92-107: ordinal not in range(25 DataBaseLibrary插入中文乱码的解决:修改D:\Python27\Lib\site-packages\DatabaseLibrary\connection_manager.py里的co…...
2023春招java面试题及答案
2023春招java面试题及答案总结1.以下Dubbo服务负载均衡策略中,哪一个策略的功能是相同参数的请求总是发到同一个提供者()2.如下代码:请问编译运行的结果是什么?3.给出如下代码:请问编译运行的结果是什么&am…...
QT+OpenGL光照
QTOpenGL光照 本篇完整工程见gitee:QtOpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主 颜色 现实生活中看到的物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的颜色 太阳光能被看见的白光是多找演的的组合…...
OpenCV-PyQT项目实战(7)项目案例03:鼠标框选
欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …...
vue2版本《后台管理模式》(上)
后台管理模式项目开发经验总结如下,希望对你们有些帮助: 文章目录一、app 出口位置二 、 index.js 路由配置三、package.json 文件四、 main.js 既然安装插件那就需要引入五、 跨域问题总结首先需要一个完整的v2版本的项目 vue2版本思路:首先…...
C++与C基础重叠部分
Cmake CPP程序开发过程 计算机硬件—>机器语言—>汇编—>cppcpp—>机器(gcc)Make(makefile)—>本地智能批处理翻译机制Cmake—>跨平台生成不同设备上的makefile进行执行 Cpp基础学习 基本知识 基本格式 #include<iostream> using namespace std;…...
神经网络基础部件-卷积层详解
前言 在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关联性,将图像数据二维矩阵送给模型中学习。 卷积神经网络(convolu…...
【计算机网络】HTTPS协议原理
文章目录一、认识HTTPS协议二、为什么要发明HTTPS三、HTTP与HTTPS的区别四、常见的加密方式1. 对称加密2. 非对称加密3. 数据摘要4. 数字签名五、HTTPS的原理探究方案1:只使用对称加密方案2:只使用非对称加密方案3:双方都使用非对称加密方案4…...
21岁,华科博士在读,我的赛事Top经验
Datawhale干货 作者:vaew,华中科技大学,博士二年级在读简介笔者vaew,21岁,现为华中科技大学机械科学与工程学院陶波教授课题组博士二年级学生。主要研究方向是基于视触融合的机器人灵巧操作。学业之余的研究兴趣包括图…...
基于ThinkPHP6.0+Vue+uni-app的多商户商城系统好用吗?
likeshop多商户商城系统适用于B2B2C、多商户、商家入驻、平台商城场景。完美契合平台自营联营加盟等多种经营方式使用,系统拥有丰富的营销玩法,强大的分销能力,支持官方旗舰店,商家入驻,平台抽佣商家独立结算ÿ…...
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、要完成的任务 目标:结合SQL和excel实现餐饮业日销售情况分析仪,如下表: 认识分析仪: 切片器:店面 分为四部分:KPI 、组合图、饼图、数…...
电商导购CPS,京东联盟如何跟单实现用户和订单绑定
前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…...
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、心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点…...
python3.9安装和pandas安装踩坑处理
0、先决条件:系统内最好先安装有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. 转置矩阵
每日一题题目描述解题核心解法一:二维表示 模拟解法二:一维表示 模拟题目描述 题目链接:867. 转置矩阵 给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
