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

NDIS小端口驱动(六)

消息信号中断 (MSI) 提供了网络设备及其微型端口驱动程序可以使用的传统基于线路的中断的替代方法。 从 Windows Vista 开始,操作系统支持两种类型的 MSI:PCI V2.2 MSI 和 PCI V3.0 MSI-X。

支持 MSI-X 的微型端口驱动程序可以指定 中断相关性,这是运行驱动程序的消息中断服务例程) CPU (中央处理单元的子集。 可以为每个 MSI-X 消息指定中断相关性,例如,可以指定具有非统一内存访问 (NUMA) 体系结构的计算机上的中断相关性,其设备与特定 CPU 的“接近度”。

MSI-X 支持可以提供显著的性能优势,尤其是对于支持接收端缩放 (RSS) 的网络接口卡 (NIC) 。

MSI-X 初始化

为了支持 MSI-X,MSI 初始化需要一个预注册阶段,在该阶段中,微型端口驱动程序会建立过滤资源要求的函数。 如果驱动程序将在 MiniportInitializeEx 函数中注册基于行的中断,则此函数可以更改每个 MSI-X 消息的中断相关性或删除消息中断资源。

预注册阶段发生在 NDIS 调用 MiniportInitializeEx 函数之前。 与基于行的中断一样,微型端口驱动程序还会在 MiniportInitializeEx 中初始化微型端口适配器时注册 MSI 中断。

MSI-X 预先注册

若要支持更改 MSI-X 的中断相关性或删除消息中断资源,微型端口驱动程序必须建立资源要求过滤函数。 此预注册步骤在 NDIS 调用 MiniportInitializeEx 函数之前发生。

若要建立资源要求过滤函数,微型端口驱动程序必须提供 MiniportSetOptions 函数。 当微型端口驱动程序从 DriverEntry 例程调用 NdisMRegisterMiniportDriver 函数时,驱动程序会传递 NDIS_MINIPORT_DRIVER_CHARACTERISTICS 结构中 MiniportSetOptions 的入口点。 NDIS 在 NdisMRegisterMiniportDriver 的上下文中调用 MiniportSetOptions 函数。

在 MiniportSetOptions 中,微型端口驱动程序调用 NdisSetOptionalHandlers 函数并指定 NDIS_MINIPORT_PNP_CHARACTERISTICS 结构。 此结构定义 MiniportAddDevice、 MiniportRemoveDevice、 MiniportStartDevice 和 MiniportFilterResourceRequirements 函数的 入口点。

当 NDIS 收到来自 即插即用 (PnP) 管理器的添加设备请求时,NDIS 会调用微型端口驱动程序的 MiniportAddDevice 函数。 NDIS 在 MiniportAdapterHandle 参数中传递给 MiniportAddDevice 的句柄是 NDIS 稍后传递给 MiniportInitializeEx 函数的句柄。

在 MiniportAddDevice 中,驱动程序初始化 NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES 结构,并将此结构传递给 NdisMSetMiniportAttributes 函数。 NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES 结构包含 MiniportAddDeviceContext 成员,该成员是设备微型端口驱动程序分配的上下文区域的句柄。 NDIS 稍后为 MiniportRemoveDevice、 MiniportFilterResourceRequirements、 MiniportStartDevice 和 MiniportInitializeEx 函数提供此上下文句柄。 对于 MiniportInitializeEx,上下文句柄在 MiniportInitParameters 参数指向的 NDIS_MINIPORT_INIT_PARAMETERS 结构的 MiniportAddDeviceContext 成员中传递。

在 NDIS 调用 MiniportAddDevice 且 MiniportAddDevice 返回NDIS_STATUS_SUCCESS后,NDIS 在每次收到 IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 请求数据包 (IRP) 时,都会调用 MiniportFilterResourceRequirements 函数。 如果驱动程序将在 MiniportInitializeEx 函数中注册基于行的中断,MiniportFilterResourceRequirements 可以更改每个 MSI-X 消息的中断相关性、添加消息中断资源或删除消息中断资源。 

当 NDIS 收到来自 PnP 管理器的 remove-device 请求时,NDIS 将调用微型端口驱动程序的 MiniportRemoveDevice 函数。 MiniportRemoveDevice 函数应撤消 MiniportAddDevice 函数执行的操作。

MSI-X 资源过滤

如果微型端口驱动程序支持 MSI-X,并且将更改每个 MSI-X 消息的中断相关性,或者将删除消息中断资源,则必须注册资源要求过滤函数。

NDIS 在 NDIS 收到网络接口卡 (NIC) 的IRP_MN_FILTER_RESOURCE_REQUIREMENTS I/O 请求数据包后,NDIS 调用 MiniportFilterResourceRequirements 函数。 NDIS 在设备堆栈中的基础函数驱动程序完成 IRP 后调用 MiniportFilterResourceRequirements 。

在 MiniportAddDevice 函数返回NDIS_STATUS_SUCCESS后,NDIS 将调用 MiniportFilterResourceRequirements。 在调用 MiniportRemoveDevice 之前,NDIS 可以随时再次调用 MiniportFilterResourceRequirements。 当微型端口运行时,NDIS 可能会调用 MiniportFilterResourceRequirements 。 虽然微型端口可能会按如下所述修改资源列表,但微型端口不应立即尝试使用新资源。 NDIS 最终将停止并使用新资源重新初始化微型端口;只有这样,微型端口才应尝试使用新资源。

IRP_MN_FILTER_RESOURCE_REQUIREMENTS在 Irp>-IoStatus.Information 中以IO_RESOURCE_REQUIREMENTS_LIST结构的形式提供资源列表。 列表中的资源由 IO_RESOURCE_DESCRIPTOR 结构描述。

微型端口驱动程序可以修改描述 MSI-X 消息的每个 CmResourceTypeInterrupt 类型的资源的中断关联策略。 如果关联策略请求以特定处理器集为目标,微型端口驱动程序还会在IO_RESOURCE_DESCRIPTOR结构中的 Interrupt.TargetedProcessors 处设置 KAFFINITY 掩码。

微型端口驱动程序可以删除作为消息中断资源的所有 CmResourceTypeInterrupt 类型的资源。 然后,驱动程序可以在 MiniportInitializeEx 函数中注册基于行的中断。 如果微型端口驱动程序不删除这些消息中断资源,如果驱动程序尝试在 MiniportInitializeEx 中注册基于行的中断,操作系统将失败。

NDIS 6.1 或更高版本的微型端口驱动程序可以将消息中断资源添加到资源列表。 例如,在具有八个 CPU 的计算机上,如果 NIC 可以生成四条 MSI-X 消息,并且操作系统启用了四个消息中断,则操作系统会在设备的 MSI-X 配置空间中初始化四个消息表条目,并将四个消息中断资源放入资源列表中。 在这种情况下,由于微型端口驱动程序需要更多的消息中断资源,因此它可以向资源列表再分配四个消息中断资源,并将每个 MSI-X 消息的相关性设置为 CPU。 如果操作系统可以提供更多消息中断资源,则微型端口适配器在启动时会收到 8 个消息中断资源。 在本例中,消息的数字介于 0 到 7。

列表中的每个消息中断资源稍后都会分配一个消息编号,该消息号与它在列表中显示的顺序相对应。 例如,列表中的第一个消息中断资源分配给消息 0,第二个消息被分配给消息 1,依此而行。

若要在运行时将 MSI-X 表项分配给 CPU,微型端口驱动程序可以调用 NdisMConfigMSIXTableEntry 函数,该函数将表项映射到已将关联设置为 CPU 的 MSI-X 消息。

若要为新的资源要求列表分配内存,请使用 NdisAllocateMemoryWithTagPriority 函数。 可以使用 NdisFreeMemory 函数释放旧资源要求列表的内存。

微型端口驱动程序不应修改其他资源,例如 CmResourceTypeMemory 和 CmResourceTypePort 资源。 微型端口驱动程序应避免将新资源添加到资源列表。 但是,NDIS 6.1 及更高版本的微型端口驱动程序可以添加更多消息中断资源。 如果微型端口驱动程序添加了更多消息中断资源,则不得将其从 MiniportStartDevice 函数中删除。

注册和取消注册 MSI 中断

为了注册 MSI 支持,微型端口驱动程序调用 NdisMRegisterInterruptEx 函数来注册 MSI 中断。 驱动程序分配并初始化 NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS 结构,以指定中断特征和函数入口点。 驱动程序必须将 NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS 结构的 MsiSupported 成员设置为 TRUE。 然后,驱动程序将结构传递给 NdisMRegisterInterruptEx。

必须定义以下函数才能支持 MSI 中断:

  • MiniportMessageInterrupt
  • MiniportMessageInterruptDpc
  • MiniportDisableMessageInterrupt
  • MiniportEnableMessageInterrupt

微型端口驱动程序应为基于行的中断函数 (提供入口点,这些入口点如以下列表) 所示,即使驱动程序支持 MSI 入口点。 如果 NDIS 未授予 MSI 中断,它可以将正常中断授予作为回退条件。

行中断函数包括以下内容:

  • MiniportInterrupt
  • MiniportInterruptDPC
  • MiniportDisableInterruptEx
  • MiniportEnableInterruptEx

驱动程序应调用 NdisMDeregisterInterruptEx 函数来释放以前使用 NdisMRegisterInterruptEx 分配的资源。

处理 MSI 中断

当网络接口卡 (NIC) 生成中断时,NDIS 调用 MiniportMessageInterrupt 函数。 此函数中的 MessageId 参数标识 MSI-X 消息。

MiniportMessageInterrupt 在处理中断后应始终返回 TRUE ,因为消息中断不共享。

微型端口驱动程序应在其 MiniportMessageInterrupt 函数中尽可能少地执行工作。 驱动程序应将 I/O 操作延迟到 MiniportMessageInterruptDpc 函数,NDIS 调用该函数来完成中断的延迟处理。

若要在 MiniportMessageInterrupt 返回后将其他延迟的过程调用 (DPC) 排队,微型端口驱动程序设置 MiniportMessageInterrupt 函数的 TargetProcessors 参数的位。 若要从 MiniportMessageInterrupt 或 MiniportMessageInterruptDPC 请求其他 DPC,微型端口驱动程序可以调用 NdisMQueueDpc 函数。

微型端口驱动程序可以调用 NdisMQueueDpc 来请求其他处理器的其他 DPC。

NDIS 6.1 及更高版本保证为同一 CPU 计划的不同消息的 DPC 单独排队。 例如,如果微型端口驱动程序在 CPU 1 上同时计划两个 DPC, (一个 DPC 用于消息 0,另一个 DPC 用于消息 1) ,则两个 DPC 将排队等待 CPU 1 (一个消息为 0 的 DPC,另一个 DPC 与消息 1) 。

NDIS 还保证针对不同 CPU 上计划的同一消息的 DPC 单独排队。 例如,如果微型端口驱动程序计划两个 DPC (CPU 0 上的一个 DPC 用于消息 0,一个 DPC 在 CPU 1 上计划消息 0) ,则两个单独的 DPC 在 CPU 0 和 CPU 1 上排队,这两个 DPC 都用于消息 0。

与 MSI 中断同步

如果微型端口驱动程序的 MiniportMessageInterrupt 函数将资源(如网络接口卡 (NIC) 寄存器或状态变量)与以较低 IRQL 运行的另一个 MiniportXxx 函数共享,则另一个 MiniportXxx 函数必须调用 NdisMSynchronizeWithInterruptEx 函数。 此调用可确保微型端口驱动程序的 MiniportSynchronizeMessageInterrupt 函数以同步且多处理器安全的方式访问共享资源。

更改 MSI-X 表项的 CPU 关联

支持 MSI-X 的 NDIS 6.1 及更高版本的微型端口驱动程序可以调用 NdisMConfigMSIXTableEntry 函数,以屏蔽、取消屏蔽 MSI-X 表条目或将 MSI-X 表条目映射到设备分配的 MSI-X 消息。 支持 RSS 的微型端口驱动程序使用 NdisMConfigMSIXTableEntry 在运行时更改 MSI-X 表条目的 CPU 相关性。

NdisMConfigMSIXTableEntry 是 GUID_MSIX_TABLE_CONFIG_INTERFACE 查询的包装器。 微型端口驱动程序可以在 NDIS 调用 MiniportInitializeEx 函数之后以及驱动程序从 MiniportHaltEx 函数返回之前调用 NdisMConfigMSIXTableEntry。

为每个 RSS 队列分配 MSI-X 表条目且队列数少于 RSS 处理器数量的微型端口驱动程序可以在 MiniportFilterResourceRequirements 函数中添加其他 MSI-X 消息资源。 

微型端口驱动程序可以设置 MSI-X 中断资源的 CPU 相关性,以便设备为每个 RSS 处理器提供至少一条 MSI-X 消息。 请注意,PCI 总线驱动程序最初映射 n MSI-X 表条目 (其中 n 是 NIC 硬件向总线报告的 MSI-X 表条目数) 修改资源中的前 n 个 MSI-X 消息。 在 NDIS 调用 MiniportInitializeEx 后,当微型端口驱动程序更改特定 MSI-X 表条目的目标处理器时,驱动程序将调用 NdisMConfigMSIXTableEntry ,以将表条目映射到已将相关性设置为所需处理器的 MSI-X 消息。

相关文章:

NDIS小端口驱动(六)

消息信号中断 (MSI) 提供了网络设备及其微型端口驱动程序可以使用的传统基于线路的中断的替代方法。 从 Windows Vista 开始,操作系统支持两种类型的 MSI:PCI V2.2 MSI 和 PCI V3.0 MSI-X。 支持 MSI-X 的微型端口驱动程序可以指定 中断相关性&#xff…...

postgresql insert on conflict 不存在则插入,存在则更新

向一张表执行插入动作,如果插入的字段数据已存在,则执行更新操作,不存在则进行插入操作。 1、创建一张表 CREATE TABLE "user_info" ( "id" int2 NOT NULL, "name" varchar(20) COLLATE "pg_catalog&quo…...

kafka配置消费者重要参数

文章目录 fetch.min.bytesfetch.max.wait.msfetch.max.bytesmax.poll.recordsmax.partition.fetch.bytessession.timeout.ms和heartbeat.interval.msmax.poll.interval.msrequest.timeout.msauto.offset.resetenable.auto.commitpartition.assignment.strategy区间(range)轮询(…...

shell笔记脚本3

执行脚本文件demo2.sh, 观察打印VAR4效果 执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果 结论 全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用 小结 自定义变量的分类 自定义局部变量: 就是在一个脚本文件内部使用 var_namevalue 自…...

Kafka消息丢失处理方式,消息丢失与消费失败区别和分别的处理

Kafka 消息丢失的处理方式可以从生产者、Broker 和消费者三个角度来考虑,以确保消息的可靠传递。以下是一些关键的处理措施: Kafka消息丢失处理方式 1. 生产者端的处理方式: 使用生产者确认(acks配置):通…...

AI爆文写作:标题需要什么?情绪炸裂,态度要激烈,行为要夸张!

现在这个传播环境下,在公域中,轻声细语,慢慢的说,无法吸引到注意,没有人搭理。 标题要需要情绪张扬,态度激烈,行为夸张,大声喧闹。 唐韧的用户群是互联网产品经理,阅读量…...

Flyway SpringBoot中使用

Flyway 一、 介绍 通过版本化数据库,提高数据库迁移的可靠性。即启动项目时就按版本执行sql脚本,实现数据库自动迁移。 Flyway是一款开源的数据库版本管理工具,它能够实现数据库迁移和版本控制。Flyway通过SQL脚本或Java代码进行数据库变更…...

全志A133 Android10 lcd配置显示硬件参数说明

一,概述 全志平台,通过board.dts来配置一些通用的 LCD 配置参数。 内核板级配置: longan/device/config/chips/a133/configs/b6/board.dts二,硬件参数说明 1. lcd接口参数说明 lcd_driver_name Lcd 屏驱动的名字(字…...

景源畅信:小白做抖音运营难吗?

在数字化时代,社交媒体已成为人们生活的一部分,而抖音作为其中的翘楚,吸引了众多希望通过平台实现自我价值和商业目标的用户。对于刚入门的小白来说,运营抖音账号可能会遇到不少挑战。接下来,我们将详细探讨这一话题&a…...

初探 Spring Boot Starter Security:构建更安全的Spring Boot应用

引言 Spring Boot 作为 Java 生态系统下的热门框架,以其简洁和易上手著称。而在构建 Web 应用程序时,安全性始终是开发者必须重视的一个方面。Spring Boot Starter Security 为开发者提供了一个简单但功能强大的安全框架,使得实现身份验证和…...

【无标题】思科交换路由中路由引入实验指南

路由引入是网络设计中的一个重要概念,它允许不同路由协议之间的路由信息交换。在思科网络设备中,路由引入可以增强网络的连通性和效率。本文将介绍路由引入的基本概念,并通过一个实验来演示如何在思科路由器中实现路由引入。 ## 路由引入的基…...

基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 .......................................................... for i 1:12 % 遍历结…...

Java进阶学习笔记2——static

static: 叫静态,可以修饰成员变量、成员方法。 成员变量按照有无static修饰,分为两种: 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享。静态成员变量。 实…...

spring boot集成Knife4j

文章目录 一、Knife4j是什么?二、使用步骤1.引入依赖2.新增相关的配置类3.添加配置信息4.新建测试类5. 启动项目 三、其他版本集成时常见异常1. Failed to start bean ‘documentationPluginsBootstrapper2.访问地址后报404 一、Knife4j是什么? 前言&…...

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…...

STM32F1之SPI通信·软件SPI代码编写

目录 1. 简介 2. 硬件电路 移位示意图 3. SPI时序基本单元 3.1 起始条件 3.2 终止条件 3.3 交换一个字节(模式0) 3.4 交换一个字节(模式1) 3.5 交换一个字节(模式2) 3.6 交换一个字节&a…...

实战:生成个性化词云的Python实践【7个案例】

文本挖掘与可视化:生成个性化词云的Python实践【7个案例】 词云(Word Cloud),又称为文字云或标签云,是一种用于文本数据可视化的技术,通过不同大小、颜色和字体展示文本中单词的出现频率或重要性。在词云中…...

云存储与云计算详解

1. 云存储与云计算概述 1.1 云存储 云存储(Cloud Storage)是指通过互联网将数据存储在远程服务器上,用户可以随时随地访问和管理这些数据。云存储的优点包括高可扩展性、灵活性和成本效益。 1.2 云计算 云计算(Cloud Computin…...

【飞舞的花瓣】飞舞的花瓣代码||樱花代码||表白代码(完整代码)

关注微信公众号「ClassmateJie」有完整代码以及更多惊喜等待你的发现。 简介/效果展示 这段代码是一个HTML页面,其中包含一个canvas元素和相关的JavaScript代码。这个页面创建了一个飘落花瓣的动画效果。 代码【获取完整代码关注微信公众号「ClassmateJie」回复“…...

网络安全的重要组成部分:数据库审计

数据库审计(简称DBAudit)以安全事件为中心,以全面审计和精确审计为基础,实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行实时告警。它通过对用户访问数据…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...