Linux网络技术学习(五)—— 网络设备初始化(I)

news2024/11/27 16:49:50

文章目录

    • 什么时候进行的设备初始化?
    • 设备注册和初始化
    • NIC(网卡 Network Interface Card)初始化的基本目标
    • 设备与内核之间的交互
    • 硬件中断
    • 中断类型
    • 传送节流方式为了改善效率
    • 中断共享
    • IRQ处理函数映射的组织
    • irqaction结构体存储方式


什么时候进行的设备初始化?

内核初始化图
在这里插入图片描述

1、当内核引导时,会执行start_kernel对一些子系统做初始化
2、start_kernel终止前会调用init内核线程,由其负责初始化的后续工作。

初始化任务中有三个部分:
1、引导期间选项
  调用两次parse_args(一次是直接调用,而另一次是通过parse_early_param间接调用)以处理引导加载程序(bootloaser)在引导期间传给内核的配置参数。
2、中断和定时器
  硬中断和软中断分别由init_IRQ和softirq_init做初始化。
3、初始化函数
  内核子系统及内建的设备驱动程序由do_initcalls初始化。free_init_mem会释放一块被无用程序所持有的内容。

run_init_process确定在系统上运行的第一进程,也就是其他进程的父进程(PID为1)一直运行直到系统做完工作。
通常运行程序是Init,管理员可以通过init=引导期间选项指定另一个不同程序。
不提供选项,内核会从一组众所周知的位置去执行init命令,如果找不到init,就会发生内核panic


设备注册和初始化

一个网络设备可以用,就必须被内核认可,并且关联正确的驱动程序。
驱动程序把驱动设备所需的所有信息存储在私有数据结构中,然后与其他需要此设备的内核组件交互。

1、注册和初始化任务的一部分由内核负责
2、其他部分由设备驱动程序负责

初始化分为:硬件初始化、软件初始化、功能初始化
1、硬件初始化
  由设备驱动程序和通用总线层(例,PCI或USB)合作完成。驱动有时会通过用户提供的参数协调,把每个设别的这类功能配置成IRQ和I/O地址,使其能与内核交互。
2、软件初始化
  在设备能使用之前,需要依赖开启和配置的网络协议(用户需要提供IP地址等配置信息)等。
3、功能初始化
  针对每个网络设备的配置。例:流量控制,可以决定封包加入及退出设备出口队列的方式。

NIC(网卡 Network Interface Card)初始化的基本目标

Linux内核中,每个设备都有一个net_device数据结构表示。net_device的分配以及内部字段的初始化,部分的是由设备驱动程序完成,部分是由内核函数完成。

设备驱动程序如何分配建立设备/内核通信所需的资源?
1、IRQ线
  NIC必须被分配一个IRQ,用于设备与内核之间的交互。虚拟设备不需要分配一个IRQ:例如内环设备,因其活动都在内部进行。
  /proc/interrupts文件可用于观察当前分派状态
2、I/O端口和内存注册
  驱动程序将其设备的一个内存区域(配置寄存器)映射到系统内存,使得驱动程序的读/写操作可以通过系统内存地址直接进行,简化代码。I/O端口和内存分别使用request_region和release_region注册和释放
在这里插入图片描述


设备与内核之间的交互

几乎所有设备(包括NIC)都采用两种与内核的交互方式:
1、轮询
  由内核端的驱动定期检查设备状态,查看是否发生了什么事情
2、中断
  由设备端驱动。当设备需要内核注意时,会向内核发送出一个硬件信号(产生中断事件)


硬件中断

每个中断事件都会运行一个函数,被称为中断处理函数,而中断处理函数必须按照设备的所需进行裁剪,因此由设备驱动程序安装。当设备驱动程序注册一个NIC时,会请求并分派一个IRQ。

static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
        const char *name, void *dev)
void free_irq(unsigned int irq, void *dev_id)

request_irq函数会注册一个处理函数。首先确保所请求的中断是一个有效的中断,而且还没分配给另一个设备,除非这两个设备能够共享IRQ
free_irq函数会删除处理函数,给定的设备由dev_id标识。如果没有其他设备注册在该IRQ线,就关闭IRQ

在内核接收到中断通知时,会使用IRQ编号找出该驱动程序的中断处理函数并执行。为了找到处理函数,内核会把IRQ编号和函数处理函数之间的相连接关系存储在一张全局表中。相连关系可以是一对一或一对多。


中断类型

通过中断,NIC能够告知其驱动程序几种不同的事件:
1、接收一帧
  这是常见标准的情况
2、传输失败
  这种事件只有当被为二进制指数后退功能失败时,才由Ethernet设备产生(由NIC在硬件层实现)。驱动程序不会把这种通知信息转送到那些较高层的网络层,这些网络层会通过其他方式获取到传输失败。
3、DMA传输已成功完成
  使用同步传输时(无DMA),当该帧已上传至NIC,驱动程序会立刻知道
  使用DMA时,使用异步传输,设备驱动程序必须等待NIC发出明确的中断事件。
4、设备有足够内存处理新传输
  当出口队列没有足够空间保存一个最大尺寸的帧时,NIC设备驱动程序会停止出口队列而关闭传输。
  当内存可用时,该队列又会再次开启


传送节流方式为了改善效率

在系统中,设备驱动程序会在队列空间缺乏时关闭传输,同时要求NIC当可用内存大于给定量时(设备的MTU)发出一个中断,然后当中断到来时重启传输。
例:

// 平台: RK3568
// drivers/net/ethernet/3com/3c509.c
static netdev_tx_t
el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
   netif_stop_queue (dev);
   ......
    if (inw(ioaddr + TX_FREE) > 1536)
        netif_start_queue(dev);
    else
        /* Interrupt us when the FIFO has room for max-sized packet. */
        outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
    ......
}

驱动程序可以用netif_stop_queue停止设备队列,以此能禁止内核提交后续的传输请求。

驱动程序会检查该设备的内存是否足够的内存容纳一个1536个字节的包。

如果有,驱动程序会启动队列,允许内核再次提交传输请求。
否则,就会指示设备(配置寄存器),当条件满足时产生一个中断。中断处理函数将使用netif_start_queue重启设备队列。


中断共享

IRQ线是有限的资源。添加系统能容纳设备数目的简单方式,就是允许几台设备共享同一个IRQ。
每个设备会针对该IRQ将其自己的处理函数注册给内核,再由内核启用这些同一个共享IRQ的设备的所有函数。而不是由中断通知,寻找正确的设备,再启用其处理函数。

一组设备共享一条IRQ线时,所有这些设备的设备驱动程序都必须能力处理共享的IRQ(换言之,每当一个设备注册要使用一条IRQ线时,就必须明确说明其是否支持中断共享。)
当另一设备试图注册同一个IRQ编号时,如果此设备或者该IRQ当前所分派的设备无法共享IRQ,就会被拒绝。


IRQ处理函数映射的组织

IRQ处理函数的映射存储在一个向量表中,每一个IRQ都对应一个处理函数列表。
只有当多台设备共享同一个IRQ时,一个列表才会有一个以上的元素。向量的尺寸取决于具体的体系结构,可以从15变化到200以上。

// 定义在include/linux/interrupt.h
struct irqaction

// 定义在include/linux/irqdesc.h
struct irq_desc

// kernel/irq/manage.c
static int
__setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)

在之前介绍的硬件中断函数request_irq函数就是包含__setup_irq的包裹函数,用一个irqaction结构体输入,然后将其插入至一个全局变量irq_desc。
handle_IRQ_event 处理中断并将其传给驱动程序的内核函数是依赖irq_desc结构体的。


irqaction结构体存储方式

在这里插入图片描述
对一个可能的IRQ都有一个irq_desc实例,每个成功注册的IRQ处理函数都有一个irqaction实例。irq_desc尺寸是由结构体中NR_IRQS指定
当给定IRQ编号(也就是irq_desc向量的给定元素)有一个以上的irqaction实例时,就需要中断共享。

irqaction数据结构的字段中存储哪些与IRQ处理例程相关的信息:

// 平台RK3288
typedef irqreturn_t (*irq_handler_t)(int, void *);
irq_handler_t      handler;                     
// handler成员为中断处理函数,由设备驱动程序所提供的函数,用于处理中断的通知信息
// 传入的参数: int irq(产生此通知信息的IRQ编号);void *dev_id(设备标识符。同一个驱动程序可能同时要负责不同的设备,需要设备ID来正确处理通知信息)

unsigned int       irq;
// 一组标识,取值为IRQF_*      定义在include/linux/interrupt.h
// IRQF_SHARED          当置位时,设备驱动程序可以处理共享的IRQ
// IRQF_IRQPOLL         中断用于轮询(出于性能考虑,只有首先在共享中断中注册的中断才被考虑)

void *dev_id
// 与此设备相关联的net_device数据结构的指针。声明为void *的原因是,不仅仅只有NIC设备使用IRQ,各种设备类型使用的不同的数据结构

struct irqaction    *next;
// 所有共享同一个IRQ编号的设备会用此指针链接成一个列表

const char *name;
// 设备名称。可以通过/proc/interrupts内容读取设备名称

在这里插入图片描述

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

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

相关文章

android fwk模块之Sensor架构

本文基于Android 12源码整理,包含如下内容: 通信架构应用层实现使用方式SensorManager抽象接口具体实现fwk层的实现native中的SensorManager的初始化流程native中的消息队列初始化与数据读取sensorservice实现HAL层的实现通信架构 应用层实现 涉及代码&…

C#开发的OpenRA的只读字典IReadOnlyDictionary实现

C#开发的OpenRA的只读字典IReadOnlyDictionary实现 怎么样实现一个只读字典? 这是一个高级的实现方式,一般情况下,开发人员不会考虑这个问题的。 毕竟代码里,只要小心地使用,还是不会出问题的。 但是如果在一个大型的代码,或者要求比较严格的代码里,就需要考虑这个问题了…

51单片机——中断系统之外部中断实验,小白讲解,相互学习

中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…

1.3配置P2P网络类型

1.3.1实验3:配置P2P网络类型 实验需求实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型实验拓扑实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤步骤1:[1] 配置IP地址 路由器R1

关于“档案大数据”的非主流看法

近日,反复拜读了前国家档案局局长杨冬权先生今年6.9档案日的大作《从“选时代”到“全时代”——智慧社会档案工作的历史性转折》,作为档案信息化从业者那真是倍感振奋,壮怀激烈! 这篇文章绝对可以用气势磅礴、高屋建瓴这样的词语…

Oracle Data Guard 角色转换(Role Transitions)

查询视图V$DATABASE的DATABASE_ROLE列可以看到数据库当前的角色。 1.角色转换介绍 Oracle Data Guard让你可以使用SQL语句或者通过Oracle Data Guard broker界面来动态更改数据库的角色,Oracle Data Guard支持以下的角色转换: 1&#xff0…

C语言——指针、数组的经典笔试题目

文章目录前言1.一维数组2.字符数组3.二维数组4.经典指针试题前言 1、数组名通常表示首元素地址,sizeof(数组名)和&数组名两种情况下,数组名表示整个数组。 2、地址在内存中唯一标识一块空间,大小是4/8字节。32位平台4字节,64位…

hive数据存储格式

1、Hive存储数据的格式如下: 存储数据格式存储形式TEXTFILE行式存储SEQUENCEFILE行式存储ORC列式存储PARQUET列式存储 2、行式存储和列式存储 解释: 1、上图左面为逻辑表;右面第一个为行式存储,第二个温列式存储; …

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

主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、程序的翻译环境和执行环境 二、详解编译和链接 1.翻译环境 2.编…

TCP协议十大特性

日升时奋斗,日落时自省 目录 1、确认应答 1.1、序号编辑 2、超时重传 3、连接管理 3.1、三次握手 3.2、四次挥手 4、滑动窗口 5、流量控制 6、拥塞控制 7、延时应答 8、捎带应答 9、面向字节流 10、异常情况 TCP协议: 特点:有…

浅析EasyCVR安防视频能力在智慧小区建设场景中的应用及意义

一、行业需求 城市的发展创造了大量工作机会,人口的聚集也推动了居民住宅建设率的增长。人民生活旨在安居乐业,能否住得“踏实”是很多劳动工作者最关心的问题。但目前随着住宅小区规模的不断扩大、人口逐渐密集,在保证居住环境舒适整洁的同…

C++入门:初识类和对象

C入门:类和对象1 本节目录C入门:类和对象11.auto关键字(C11)1.1类型别名思考1.2auto简介typeid运算符:获取类型信息1.3 auto的使用细则1.4auto不能推到的场景2.基于范围的for循环(C11)2.1范围for的语法2.2范围for的使用条件3.指针…

SpringCloud篇——什么是SpringCloud、有什么优缺点、学习顺序是什么

文章目录一、首先看官方解释二、Spring Cloud 的项目的位置三、Spring Cloud的子项目四、Spring Cloud 现状五、spring cloud 优缺点六、Spring Cloud 和 Dubbo 对比七、Spring Cloud 学习路线一、首先看官方解释 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式…

【Azure 架构师学习笔记】-Azure Logic Apps(6)- Logic Apps调用ADF

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别 前言 Logic Apps 和 ADF 的搭配使用是常见的组合,它们可以互相弥补各自的不足和…

opencv绘制椭圆

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ViT自适应patch划分 ACM MM 2021

Transformer在计算机视觉方面取得了巨大的成功,而如何分割图像中的patch仍然是一个问题。现有的方法通常使用固定大小的patch embedding,这可能会破坏对象的语义。为了解决这一问题,作者提出了一种新的Deformable Patch模块(DPT&a…

CPP2022-30-期末模拟测试03

6-1 引用作函数形参交换两个整数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 设计一个void类型的函数Swap&#xff0c;该函数有两个引用类型的参数&#xff0c;函数功能为实现两个整数交换的操作。 裁判测试程序样例&#xff1a; #include <…

Linux网络:聚合链路技术

目录 一、聚合链路技术 1、bonding作用 2、Bonding聚合链路工作模式 3、Bonding实现 一、聚合链路技术 1、bonding作用 将多块网卡绑定同一IP地址对外提供服务&#xff0c;可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding&#xff0c…

微信小程序DAY2

文章目录DAY2一、学习目标二、数据绑定2-1、插值表达式![请添加图片描述](https://img-blog.csdnimg.cn/f433301ae5de4094bc397a8c5ea216d7.png)2-2、Mustache语法的应用场景2-2-1、绑定属性2-2-2、三元运算三、事件绑定3-1、事件对象的属性列表3-2、target 和 currentTarget 的…

Win12呼之欲出

Win10系统的电子授权将要停止&#xff0c;20H2、21H2两个版本未来也没有非安全更新了&#xff0c;只剩下Win10 22H2最新版还会继续更新功能&#xff1b;考虑到Win10庞大的基数&#xff0c;至少10亿台电脑的装机量依然是不可忽视的&#xff0c;所以Win10马上被淘汰是不可能的&am…