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

news2024/11/17 12:57:42

文章目录

    • 初始化选项
    • 模块选项
    • 设备处理层初始化: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
  输出有关由网络代码所用的软件中断的统计数据。

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

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

相关文章

Java微服务安全丨雪崩问题及解决方案

1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&…

微信小程序 之 原生开发

目录 一、前期预备 1. 预备知识 ​2. 注册账号 - 申请AppID 3. 下载小程序开发工具 4. 小程序项目结构 ​5. 小程序的MVVM架构 二、创建小程序项目 1. 查看注册的appId ​2. 创建项目 ​3. 新建页面 01 - 创建text页面文件夹 ​02 - 新建text的page ​03 - 在app.json中配置 ​…

从未想过制作数据可视化展示竟可以如此简单

还在跟着网络上一节课好几个小时的付费课程学习如何制作数据可视化大屏嘛&#xff1f;还在为不知道怎么设计数据展示排版而苦恼&#xff1f;今天教大家用最简单的方式制作一个数据可视化大屏&#xff0c;首先让我们看一下参考大屏样式&#xff1a;接下来我们将制作数据可视化大…

【Kubernetes】【九】Label,Deployment,Service

Label Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识&#xff0c;用来对它们进行区分和选择。 Label的特点&#xff1a; 一个Label会以key/value键值对的形式附加到各种对象上&#xff0c;如Node、Pod、Service等等一个资源对象可以定义任意数量的L…

Python正则表达式中group与groups的用法详解

本文主要介绍了Python正则表达式中group与groups的用法详解&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧目录在Python中&#xff0c;正则表达式的group和groups方…

阿里一面:你做过哪些代码优化?来一个人人可以用的极品案例

前言 在尼恩读者50交流群中&#xff0c;尼恩经常指导小伙伴改简历。 改简历所涉及的一个要点是&#xff1a; 在 XXX 项目中&#xff0c;完成了 XXX 模块的代码优化 另外&#xff0c;在面试的过程中&#xff0c;面试官也常常喜欢针对提问&#xff0c;来考察候选人对代码质量的追…

06 OpenCV 阈值处理、自适应处理与ostu方法

1 基本概念 CV2中使用阈值的作用是将灰度图像二值化&#xff0c;即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如&#xff0c;在物体检测和跟踪中&#xff0c;可以通过对图像进行阈值处理来提取目…

更专业、安全、可控!政企都选择WorkPlus私有化部署

现如今政企机构在信息化建设的过程中&#xff0c;内部的沟通协作都离不开即时通讯软件。但大多数企业使用的即时通讯软件都是Saas部署的&#xff0c;虽然使用Saas部署产品成本低&#xff0c;又方便快捷&#xff0c;但还是建议企业有条件最好使用私有化部署的即时通讯软件&#…

ERP是什么?中小商户有必要用吗?秦丝、金蝶、管家婆哪家强?

ERP系统刚开始传入中国的时候&#xff0c;基本上只有超大型或大型企业有条件实施&#xff0c;不过最近几年随着小微企业、中小商户的信息化需求不断增长&#xff0c;ERP软件已慢慢被普遍使用。但是仍然有不少中小商户&#xff0c;还没搞清楚ERP到底是什么&#xff0c;看到大家都…

【LeetCode】每日一题(5)

题目&#xff1a;2341. 数组能形成多少数对 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; class Solution { public:vector<int> numberOfPairs(vector<int>& nums) {} }; 解题思路&#xff1a; 做了一个星期的每日一题&#xff0c;终于…

自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲

自动驾驶&#xff1a;BEV开山之作LSS&#xff08;lift,splat,shoot&#xff09;原理代码串讲前言Lift参数创建视锥CamEncodeSplat转换视锥坐标系Voxel Pooling总结前言 目前在自动驾驶领域&#xff0c;比较火的一类研究方向是基于采集到的环视图像信息&#xff0c;去构建BEV视角…

疑似45亿地址信息泄露事件跟进后续

开放隐私计算 收录于合集#数据安全13个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区…

重生之我是赏金猎人-漏洞挖掘(十一)-某SRC储存XSS多次BypassWAF挖掘

0x01&#xff1a;利用编辑器的超链接组件导致存储XSS 鄙人太菜了&#xff0c;没啥高质量的洞呀&#xff0c;随便水一篇文章吧。 在月黑风高的夜晚&#xff0c;某骇客喊我起床挖洞&#xff0c;偷瞄了一下发现平台正好出活动了&#xff0c;想着小牛试刀吧 首先信息收集了一下&a…

【ns-3】零基础安装教程

文章目录前言1. 安装虚拟机及Ubuntu2. 安装依赖库3. 下载ns-34. 构建ns-3前言 近期因工作需要开始接触ns-3。作者零基础&#xff0c;从零开始顺利完成了ns-3的安装。本篇为ns-3安装过程记录贴或针对小白的零基础教程。 本篇内容所使用到的软件版本信息如下&#xff1a;VMware…

这5个代码技巧,让我的 Python 加速了很多倍

Python作为一种功能强大的编程语言&#xff0c;因其简单易学而受到很多初学者的青睐。它的应用领域又非常广泛&#xff1a;科学计算、游戏开发、爬虫、人工智能、自动化办公、Web应用开发等等。 而在数据科学领域中&#xff0c;Python 是使用最广泛的编程语言&#xff0c;并且…

【Flink】Flink时间语义详解

简介 在流处理中&#xff0c;时间是一个非常核心的概念&#xff0c;是整个系统的基石。我们经常会遇到这样的需求&#xff1a;给定一个时间窗口&#xff0c;比如一个小时&#xff0c;统计时间窗口内的数据指标。那如何界定哪些数据将进入这个窗口呢&#xff1f;在窗口的定义之…

【C语言】程序环境和预处理|预处理详解|定义宏(下)

主页&#xff1a;114514的代码大冒 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 2.5带副作用的宏参数 2.6宏和函数的对比 3#undef ​编辑 4 命令行定义…

直播 | StarRocks 实战系列第二期--导入优化&问题排查

2023 年开春&#xff0c; StarRocks 社区重磅推出入门级实战系列直播&#xff0c;手把手带你从 Zero to Hero 成为一个 “StarRocks Pro”&#xff01;通过实际操作和应用场景的结合&#xff0c;我们将帮你系统性地学习 StarRocks 这个当今最热门的开源 OLAP 数据库。本次&…

WebSocket+xterm+springboot+vue 实现 xshell 操作linux终端功能

效果图 1.工具介绍与安装 1.1 xterm.js xterm 是一个使用 TypeScript 编写的前端终端组件&#xff0c;可以直接在浏览器中实现一个命令行终端应用。Xterm.js 适用于大多数终端应用程序&#xff0c;如 bash&#xff0c;vim 和 tmux&#xff0c;这包括对基于curses的应用程序和…