当前位置: 首页 > 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)以安全事件为中心,以全面审计和精确审计为基础,实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行实时告警。它通过对用户访问数据…...

Wan2.2-I2V-A14B Java开发集成指南:SpringBoot后端服务调用

Wan2.2-I2V-A14B Java开发集成指南:SpringBoot后端服务调用 1. 引言 如果你是一名Java后端开发者,正考虑将AI视频生成能力集成到现有系统中,这篇教程就是为你准备的。我们将手把手教你如何在SpringBoot项目中调用私有化部署的Wan2.2-I2V-A1…...

DAMOYOLO模型一键部署教程:基于Ubuntu20.04与Docker环境

DAMOYOLO模型一键部署教程:基于Ubuntu20.04与Docker环境 想试试最新的目标检测模型,但被复杂的依赖和配置搞得头大?别担心,今天咱们就来聊聊怎么用最简单的方式,在Ubuntu 20.04上把DAMOYOLO模型跑起来。整个过程就像搭…...

Ostrakon-VL-8B辅助作业批改实战:识别手写公式与图表

Ostrakon-VL-8B辅助作业批改实战:识别手写公式与图表 每次批改理科作业,是不是都感觉眼睛快看花了?特别是面对几十份甚至上百份的手写作业,那些密密麻麻的公式、歪歪扭扭的电路图,还有各式各样的化学符号,…...

C标准库缓冲区溢出问题与安全编程实践

1. C标准库缓冲区溢出问题概述缓冲区溢出是C语言开发中最常见的安全漏洞之一。作为一名有十年经验的嵌入式开发者,我见过太多由于不当使用标准库函数导致的崩溃和安全问题。缓冲区溢出通常发生在程序向固定大小的缓冲区写入超过其容量的数据时,多余的数据…...

OpenClaw语音交互:Phi-3-mini接入麦克风输入实战

OpenClaw语音交互:Phi-3-mini接入麦克风输入实战 1. 为什么需要语音交互能力 上周我在整理电脑文件时突然想到一个问题:当我的双手被占用时(比如正在做饭或修理设备),如何让OpenClaw帮我执行任务?传统的键…...

Pixel Couplet Gen实操手册:微信小程序分包加载优化像素春联H5首屏速度

Pixel Couplet Gen实操手册:微信小程序分包加载优化像素春联H5首屏速度 1. 项目背景与核心价值 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的创新应用。通过ModelScope大模型的文本生成能力,结合精心设计的8-bit视觉元素,…...

DYOR 嘉创地产 02421.HK

文章目录1.公司概况1.1 简介1.2 股权结构1.3 核心资质与定位2.业务布局3.财务与市场表现:业绩承压,规模迷你3.1 业绩大幅下滑3.2 市场表现落后3.3 规模在行业中垫底4.核心优势5.潜在风险与隐忧6.小结参考文献1.公司概况 1.1 简介 嘉创地产是一家脱胎于…...

Pixel Couplet Gen应用场景:微信小程序‘灵蛇贺岁’互动模块开发全解析

Pixel Couplet Gen应用场景:微信小程序灵蛇贺岁互动模块开发全解析 1. 项目背景与核心价值 在传统节日数字化呈现的浪潮下,我们开发了"灵蛇贺岁"微信小程序互动模块。这款基于ModelScope大模型的春联生成器,通过创新的像素游戏风…...

Spring AI实战系列(七):Chat Memory对话记忆实战,基于Redis实现持久化多轮对话

一、系列回顾与本篇定位1.1 系列回顾第一篇:完成Spring AI与阿里云百炼的基础集成,基于ChatModel 实现同步对话与API Key安全注入。第二篇:解锁ChatClient,实现全局统一配置与链式调用,告别重复样板代码。第三篇&#…...

AI报告文档审核助力本地化升级:IACheck如何支撑食品加工行业数据安全与质量协同发展

在食品加工行业不断强化质量控制与数据安全要求的背景之下,“本地部署”正逐渐成为企业数字化转型中的关键路径之一,尤其是在涉及检测数据与质量报告的场景中,数据不仅需要具备高度准确性,还必须满足合规与安全要求,因…...