windows驱动开发-PNP管理器

PNP技术是由Microsoft提出的,英文Plug and play的缩写,中译即插即用,意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序,做到插上就能用,无须人工干预,是Windows自带的一项技术。所谓即插即用是指将符合PNP标准的PC插卡等外围设备安装到电脑时,操作系统自动设定系统结构的技术。这就是说,当用户安装新的硬件时,不必设置任何跳线器开关,也不必用软件配置中断请求、内存地址或直接存储器存取(DMA)通道,Windows会向应用程序通知硬件设备的新变化,并会自动协调IRQ、内存地址和DMA通道之间的冲突。

PnP 管理器包含两个部分:内核模式 PnP 管理器和用户模式 PnP 管理器。 内核模式 PnP 管理器与操作系统组件和驱动程序交互,以配置、管理和维护设备。 用户模式 PnP 管理器与用户模式安装组件(如类安装程序)交互,以配置和安装设备。 用户模式 PnP 管理器还与应用程序交互,例如,注册应用程序以通知设备更改,并在发生设备事件时通知应用程序,它们之间的协作如下图:

PnP 驱动程序支持计算机上的物理、逻辑和虚拟设备。 术语“PnP 驱动程序”是指支持PNP接口的任何 Windows 驱动程序。 虽然大多数 PnP 驱动程序也是 WDM 驱动程序,因此跨 Windows 平台与源兼容,但一些驱动程序支持 PnP,而无需完全实现 WDM。

所有驱动程序都应支持 PnP 和电源管理。 如果单个驱动程序不支持 PnP 和电源管理,它将限制整个系统的 PnP 和电源管理支持。

若要支持 PnP,驱动程序必须遵循以下准则:

  • 它必须包含 DispatchPnP 例程;
  • 此调度例程必须处理 IRP_MJ_PNP 请求和关联的次要函数代码。 有关详细信息,请参阅 DispatchPnP 例程;
  • 它不得搜索硬件;
  • PnP 管理器负责确定硬件设备是否存在。 当 PnP 管理器检测到设备时,它会通过调用其 AddDevice 例程通知驱动程序。 当系统启动时,或者用户向正在运行的系统添加设备或从中删除设备时,都可以检测到硬件;
  • 它不得分配硬件资源;
  • PnP 驱动程序必须为 PnP 管理器提供设备可能使用的资源列表。 PnP 管理器负责将资源分配给每个设备,并在驱动程序发送 IRP_MN_START_DEVICE 请求时通知每个设备的分配。 因此,驱动程序必须能够处理各种硬件资源配置;
PnP设备的状态转换

在PnP 系统上,设备在配置、启动、可能停止以重新平衡资源以及可能被删除时会转换各种PnP状态。下图显示了设备的PnP 状态,以及设备如何从一种状态转换为另一种状态:

从上图左上角开始,PnP设备实际存在于系统中,因为用户刚刚插入了设备,或者设备在启动时存在,系统软件尚不知道该设备。

若要开始设备的软件配置,PnP 管理器和父总线驱动程序会枚举设备。 PnP 管理器(可能来自用户模式组件的帮助)标识设备的驱动程序,包括函数驱动程序和任何可选的Filter驱动程序。 如果尚未加载驱动程序,PnP 管理器会调用每个驱动程序的 DriverEntry 例程。 

初始化驱动程序后,它必须准备好初始化其设备。 PnP 管理器为驱动程序控制的每个设备调用驱动程序的 AddDevice 例程。

当驱动程序收到来自 PnP 管理器 的IRP_MN_START_DEVICE 请求时,驱动程序会启动设备并准备好处理设备的 I/O 请求。

如果 PnP 管理器必须重新配置活动设备的硬件资源,则会向设备的驱动程序发送 IRP_MN_QUERY_STOP_DEVICE 和 IRP_MN_STOP_DEVICE 请求。 重新配置硬件资源后,PnP 管理器会通过发送 IRP_MN_START_DEVICE 请求来指示驱动程序重启设备。启动配置设备的驱动程序可以在设备启动之前接收 IRP_MN_QUERY_STOP_DEVICE 和 IRP_MN_STOP_DEVICE 请求,尽管上图中未显示此步骤。

当 PnP 设备正在从系统中物理删除或已被删除时,PnP 管理器会将各种删除 IRP 发送到设备的驱动程序,指示它们删除设备的软件表示,包括设备对象等 。 

在删除驱动程序的所有设备之后的某个时刻,PnP 管理器会调用驱动程序的 Unload 例程并卸载驱动程序。

PNP设备加入系统

下图显示了配置设备的第一步,从用户将硬件插入计算机开始。

 

以下注释对应于上图中带圆圈的数字:

  • 用户将PnP 设备插入PnP 总线上的可用槽。在此示例中,用户将PnP USB 游戏杆插入 USB 主机控制器上的集线器。 USB 集线器是PnP 总线设备,因为子设备可以连接到它;
  • 总线设备的功能驱动程序确定新设备在其总线上。驱动程序如何确定这一点取决于总线体系结构。 对于某些总线,总线功能驱动程序会收到新设备的热插拔通知。 如果总线不支持热插拔通知,则用户必须在控制面板中采取适当的操作,以枚举总线。在此示例中,USB 总线支持热插拔通知,因此 USB 总线的功能驱动程序会收到其子级已更改的通知;
  • 总线设备的功能驱动程序通知PnP 管理器其子设备集已更改。函数驱动程序使用 BusRelations 类型调用 IoInvalidateDeviceRelations 来通知PnP管理器;
  • PnP 管理器查询总线的驱动程序,以获取总线上的当前设备列表。PnP 管理器将 IRP_MN_QUERY_DEVICE_RELATIONS 请求发送到总线的设备堆栈, Parameters.QueryDeviceRelations.Type 值为 BusRelations,表示PnP 管理器正在请求总线上存在的当前设备列表 (根据总线关系) 。PnP 管理器将IRP发送到总线的设备堆栈中的顶部驱动程序。 根据PnPIRP的规则,堆栈中的每个驱动程序处理 IRP,并将IRP向下传递到下一个驱动程序;
  • 总线设备的函数驱动程序处理 IRP。在此示例中,USB 集线器驱动程序处理中心 FDO 的此 IRP。 中心驱动程序为游戏杆设备创建 PDO ,并在使用IRP返回的子设备列表中包括指向游戏杆 PDO 的引用指针。当 USB 中心的父总线驱动程序 (USB 主机控制器类/微型类驱动程序对) 完成IRP时,IRP 将通过中心驱动程序注册的任何 IoCompletion 例程来备份设备堆栈;

请注意,总线函数驱动程序通过请求PnP 管理器查询其子设备列表来报告其子设备列表中的更改。 总线设备的所有驱动程序都可以看到生成的 IRP_MN_QUERY_DEVICE_RELATIONS 请求。 通常,总线函数驱动程序是处理IRP和报表子级的唯一驱动程序。 在某些设备堆栈中,存在总线Filter驱动程序,并参与构建总线关系列表。 一个示例是 ACPI,它附加为 ACPI 设备的总线Filter驱动程序。在某些设备堆栈中,非总线Filter驱动程序处理 IRP_MN_QUERY_DEVICE_RELATIONS 请求,但这并不典型。

此时,PnP 管理器在总线上具有当前设备列表。 然后,PnP 管理器确定任何设备是新到达设备还是已删除设备。 在此示例中,有一个新设备。 下图显示了为新设备创建开发节点并开始配置设备的 PnP 管理器:

以下注释对应于上图中带圆圈的数字:

1. PnP 管理器为总线上的任何新子设备创建开发节点。PnP 管理器将 IRP_MN_QUERY_DEVICE_RELATIONS IRP 中返回的总线关系列表与当前记录在 PnP 设备树中的总线的子级列表进行比较。 PnP 管理器为每个新设备创建一个开发节点,并为已删除的任何设备启动删除处理。

在此示例中,有一个新设备 (游戏杆) ,因此 PnP 管理器为游戏杆创建开发节点。 此时,为游戏杆配置的唯一驱动程序是父 USB 集线器总线驱动程序,该驱动程序创建了游戏杆的 PDO。 设备堆栈中也会存在任何可选的总线Filter驱动程序,但为简单起见,本示例省略了总线Filter驱动程序。上图中两个开发节点之间的宽箭头指示游戏杆开发节点是 USB 集线器开发节点的子级。

2. PnP 管理器收集有关新设备的信息,并开始配置设备。PnP 管理器将一系列 IRP 发送到设备堆栈,以收集有关设备的信息。 此时,设备堆栈仅包含设备的父总线驱动程序创建的 PDO,以及任何可选总线Filter驱动程序的筛选 DO。 因此,总线驱动程序和总线Filter驱动程序是唯一响应这些 IRP 的驱动程序。 在此示例中,游戏杆设备堆栈中唯一的驱动程序是父总线驱动程序,即 USB 集线器驱动程序。

PnP 管理器通过向设备堆栈发送 IRP 来收集有关新设备的信息。 这些 IRP 包括以下内容:

  • IRP_MN_QUERY_ID为以下每种硬件 ID 类型的单独 IRP:BusQueryDeviceID、BusQueryInstanceID、BusQueryHardwareIDs、BusQueryCompatibleIDs、BusQueryContainerID
  • IRP_MN_QUERY_CAPABILITIES
  • IRP_MN_QUERY_DEVICE_TEXT,为以下每个项创建单独的 IRP:DeviceTextDescription、DeviceTextLocationInformation
  • IRP_MN_QUERY_BUS_INFORMATION
  • IRP_MN_QUERY_RESOURCES
  • IRP_MN_QUERY_RESOURCE_REQUIREMENTS

在处理新 PnP 设备的这一阶段,PnP 管理器发送上面列出的 IRP,但不一定按列出的顺序发送,因此不应假设 IRP 的发送顺序。 此外,不应假定 PnP 管理器仅发送上面列出的 IRP。

PnP 管理器检查注册表以确定设备以前是否已安装在此计算机上。 PnP 管理器在 Enum 分支下检查<设备的枚举器>\<deviceID> 子项。 在此示例中,该设备是新设备,必须“从头开始”进行配置。

3. PnP 管理器将有关设备的信息存储在注册表中。

注册表的Enum分支保留供操作系统组件使用,其布局可能会更改。 驱动程序编写器必须使用系统例程来提取与驱动程序相关的信息。 请勿直接从驱动程序访问Enum分支。 列出的以下 枚举 信息仅用于调试目的:

a. PnP 管理器在该设备枚举器的键下为设备创建子项:PnP 管理器创建名为 HKLM\System\CurrentControlSet\Enum\<enumeratordeviceID> 的enumeratordeviceID子项。 如果子项尚不存在,则创建该子项。枚举器是基于 PnP 硬件标准发现 PnP 设备的组件。 枚举器的任务由 PnP 总线驱动程序与 PnP 管理器合作执行。

设备通常由其父总线驱动程序(例如 PCI 或 PCMCIA)枚举。 某些设备由总线Filter驱动程序(如 ACPI)枚举。

b. PnP 管理器为设备的此实例创建子项:如果 Capabilities.UniqueID 为 IRP_MN_QUERY_CAPABILITIES 返回为 TRUE,则设备的唯一 ID 在系统中是唯一的。 如果没有,PnP 管理器会修改 ID,使其在系统范围内是唯一的。

PnP 管理器创建名为 HKLM\System\CurrentControlSet\Enum\<enumerator><\deviceID>\<instanceID> 的子项。

PnP 管理器将有关设备的信息写入设备实例的子项。

c. PnP 管理器存储信息,包括以下设备提供的内容:

  • DeviceDesc ,来自 IRP_MN_QUERY_DEVICE_TEXT
  • Location,来自 IRP_MN_QUERY_DEVICE_TEXT
  • Capabilities ,来自 IRP_MN_QUERY_CAPABILITIES 的标志
  • UINumber,来自 IRP_MN_QUERY_CAPABILITIES
  • HardwareID,来自 IRP_MN_QUERY_ID
  • CompatibleIDs,来自 IRP_MN_QUERY_ID
  • ContainerID,来自 IRP_MN_QUERY_ID
  • LogConf\BootConfig,来自 IRP_MN_QUERY_RESOURCES
  • LogConf\BasicConfigVector,来自 IRP_MN_QUERY_RESOURCE_REQUIREMENTS

此时,PnP 管理器已准备好查找设备的功能驱动程序和Filter驱动程序。 请参阅下图:

 

以下注释对应于上图中的编号圆圈:

  1. 内核模式 PnP 管理器与用户模式 PnP 管理器和用户模式安装程序组件进行协调,以查找设备的功能和Filter驱动程序。内核模式 PnP 管理器将事件排队到用户模式 PnP 管理器,标识需要安装的设备。 特权用户登录后,用户模式组件将继续查找驱动程序。 
  2. 用户模式安装程序组件指示内核模式 PnP 管理器加载功能和Filter驱动程序,用户模式组件调用回内核模式以加载驱动程序,从而导致调用其 AddDevice 例程。

下图显示了 PnP 管理器加载适用的驱动程序,调用其 AddDevice 例程,并指示驱动程序启动设备:

 

以下注释对应于上图中的编号圆圈:

1. 底层的Filter驱动程序

在功能驱动程序附加到设备堆栈之前,PnP 管理器会处理任何低Filter驱动程序。 对于每个低Filter驱动程序,如果驱动程序尚未加载,PnP 管理器会调用驱动程序的 DriverEntry 例程。 然后PnP 管理器调用驱动程序的 AddDevice 例程。 在其 AddDevice 例程中,Filter驱动程序 (Filter DO) 创建Filter设备对象,并将其附加到设备堆栈 (IoAttachDeviceToDeviceStack) 。 将设备对象附加到设备堆栈后,驱动程序将作为设备的驱动程序使用。

在 USB 游戏杆示例中,有一个适用于设备的低Filter驱动程序。

2. 功能驱动程序

附加任何较低的Filter后,PnP 管理器将处理功能驱动程序。 如果尚未加载驱动程序,则PnP 管理器会调用功能驱动程序的 DriverEntry 例程,并调用功能驱动程序的 AddDevice 例程。 功能驱动程序 (FDO) 创建函数设备对象,并将其附加到设备堆栈。

在此示例中,USB 游戏杆的功能驱动程序实际上是一对驱动程序:HID 类驱动程序和 HID 微类驱动程序。 这两个驱动程序协同工作,充当功能驱动程序。 驱动程序对仅创建一个 FDO 并将其附加到设备堆栈。

3. 上层Filter驱动程序

附加功能驱动程序后,PnP 管理器将处理任何上层Filter驱动程序。

在此示例中,有一个适用于设备的上层Filter驱动程序。

4. 分配资源和启动设备

如果需要,PnP 管理器会向设备分配资源,并发出IRP来启动设备。

  • a.分配资源
  • 在配置过程的早期,PnP 管理器从设备的父总线驱动程序中收集了设备的硬件资源要求。 为设备加载完整的驱动程序集后,PnP 管理器会向设备堆栈发送 IRP_MN_FILTER_RESOURCE_REQUIREMENTS 请求。 堆栈中的所有驱动程序都有机会处理此IRP并在必要时修改设备的资源要求列表。
  • 如果设备需要资源,则PnP 管理器会根据设备的要求和当前可用的资源将资源分配给设备。
  • PnP 管理器可能需要重新排列现有设备的资源分配以满足新设备的需求。 这种资源重新分配称为“重新均衡”。现有设备的驱动程序在重新平衡期间接收一系列停止和启动 IRP,但重新平衡必须对用户透明。
  • 在 USB 游戏杆示例中,USB 设备不需要硬件资源,因此PnP 管理器将资源列表设置为 NULL。
  • b.启动设备 (IRP_MN_START_DEVICE)
  • PnP 管理器将资源分配给设备后,会将 IRP_MN_START_DEVICEIRP发送到设备堆栈,以指示驱动程序启动设备。

启动设备后,PnP 管理器再向设备的驱动程序发送三个 IRP:

  • IRP_MN_QUERY_CAPABILITIES:启动IRP成功完成后,PnP 管理器将另一 个IRP_MN_QUERY_CAPABILITIESIRP发送到设备堆栈。 设备的所有驱动程序都可以选择处理 IRP。PnP 管理器此时会在附加所有驱动程序并启动设备后发送此 IRP,因为函数或Filter驱动程序可能需要访问设备来收集功能信息。
  • IRP_MN_QUERY_PNP_DEVICE_STATE:例如,此IRP使驱动程序有机会报告设备不应显示在用户界面(如 设备管理器 和 Hotplug 程序)中。 这对于系统上存在但在当前配置中不可用的设备(例如,在取消停靠笔记本电脑时无法使用的笔记本电脑上的游戏端口)非常有用。
  • 总线关系的IRP_MN_QUERY_DEVICE_RELATIONSPnP 管理器发送此IRP以确定设备是否具有任何子设备。 如果是,则PnP 管理器将配置每个子设备。

注意: 

GUID_PNP_LOCATION_INTERFACE 接口为设备提供 SPDRP_LOCATION_PATHS 即插即用 (PnP) 设备属性。

若要在驱动程序中实现此接口,请处理 interfaceType = GUID_PNP_LOCATION_INTERFACE IRP_MN_QUERY_INTERFACE IRP,驱动程序提供指向PNP_LOCATION_INTERFACE结构的指针,该结构包含指向接口的各个例程的指针, PnpGetLocationString 例程提供设备SPDRP_LOCATION_PATHS属性中特定于设备的部分。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

极简shell制作

&#x1f30e;自定义简单shell制作 &#xff08;ps: 文末有完整代码&#xff09; 文章目录&#xff1a; 自定义简单shell制作 简单配置Linux文件 自定义Shell编写 命令行解释器       获取输入的命令       字符串分割       子进程进行进程替换 内建命令…

.NET 检测地址/主机/域名是否正常

&#x1f331;PING 地址/主机名/域名 /// <summary>/// PING/// </summary>/// <param name"ip">ip</param>/// <returns></returns>public static bool PingIp(string ip){System.Net.NetworkInformation.Ping p new System.N…

OpenAI 新推出 AI 问答搜索引擎——SearchGPT 震撼登场

您的浏览器不支持 video 标签。 OpenAI-SearchGPT 近日&#xff0c;OpenAI 曝光了自己的一款令人瞩目的 AI 问答搜索引擎——SearchGPT。这款搜索引擎带来了全新的搜索体验&#xff0c;给整个行业带来了巨大的压力。 SearchGPT 支持多种强大的功能。首先&#xff0c;它能够通过…

蓝桥杯练习系统(算法训练)ALGO-949 勇士和地雷阵

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 勇士们不小心进入了敌人的地雷阵&#xff08;用n行n列的矩阵表示&#xff0c;*表示某个位置埋有地雷&#xff0c;-表示某个…

ARP防火墙能够为网络安全贡献什么样的力量

ARP防火墙&#xff08;Address Resolution Protocol Firewall&#xff09;作为网络安全的一环&#xff0c;起到保护网络免受ARP欺骗攻击的关键作用。今天德迅云安全给您介绍ARP防火墙的相关方面&#xff0c;帮助您深入了解和认识这一关键的安全措施。 网络安全对于现代社会的信…

金三银四面试题(二十四):享元模式知多少?

什么是享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;从而提高性能。它主要用于处理大量细粒度对象的情况&#xff0c;通过将这些对象的可共享部分&#xff08;内部状态&#xff09…

毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)

毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…

MYSQL从入门到精通(二)

1、MYSQL高级概述 【1】架构概述 【2】索引优化 【3】查询截取 【4】mysql锁机制 【5】主从复制 2、MYSQL概述 【1】mysql内核 【2】sql优化工程师 【3】mysql服务器的优化 【4】各种参数常量设定 【5】查询语句优化 【6】主从复制 【7】软硬件升级 【8】容灾百分 【9】sql编…

Flutter笔记:Widgets Easier组件库(1)使用各式边框

Flutter笔记 Widgets Easier组件库&#xff08;1&#xff09;&#xff1a;使用边框 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

Leetcode—377. 组合总和 Ⅳ【中等】

2024每日刷题&#xff08;124&#xff09; Leetcode—377. 组合总和 Ⅳ 算法思想 实现代码 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned long long>dp(target 1);dp[0] 1;for(int i 1; i < target;…

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

社交媒体数据恢复:WorldTalk

WorldTalk数据恢复方法 在本文中&#xff0c;我们将探讨如何恢复在WorldTalk中删除的信息。请注意&#xff0c;这些步骤并不是专门针对WorldTalk软件设计的&#xff0c;而是基于一般的手机数据恢复流程。由于WorldTalk是一款全球5亿人使用的交友APP&#xff0c;用户分别来自中…

EDA(一)Verilog

EDA&#xff08;一&#xff09;Verilog Verilog是一种用于电子系统设计自动化&#xff08;EDA&#xff09;的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;主要用于设计和模拟电子系统&#xff0c;特别是在集成电路&#xff08;IC&#xff09;和印刷电路板&#xff08;…

TCP 协议

TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去。 序号&#xff1a;发送数据的序号。 确认序号&#xff1a;应答报文的序号&#xff0c;用来回复发送方的。 4 位首部长度&#xff1a;一个 TCP 报头&#xff0c;长度是可变的&#xff…

zotero better notes报错:Error: ReferenceError: topItem is not defined

我的自定义笔记模板名称是&#xff1a;简约风格 然后就遇到了以下报错&#xff1a; Error: ReferenceError: topItem is not defined 解决办法&#xff1a; 将模板名称前面加上[Item] 之后就可以正常导入笔记模板了~

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式&#xff1a;AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外&#xff0c;AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF

前言 复现该漏洞只是为了学习相关知识&#xff0c;在这里仅仅做简单记录下 exp&#xff0c;关于漏洞的详细内容请参考其他文章&#xff0c;最后在 v5.18.19 内核版本上复现成功&#xff0c;v6.0.2 复现失败 漏洞利用 diff --git a/include/linux/skbuff.h b/include/linux/s…