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属性中特定于设备的部分。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1&#xff1a;计算&#xff1a; 解&#xff1a; 解析&#xff1a;①左边的置换是1保持不变&#xff0c;2变成3&#xff0c;3变成4&#xff0c;4变成5&#xff0c;5变成2&#xff0c;因此可以简写为(2345)&#xff1b;右边的置换是2和5保持不变&#xff0c;1变成3&#xff…

IDEA 2022.1版本开始,可以直接运行Markdown里的命令行

参照这种格式&#xff1a; shell mvn clean install注意idea支持的版本&#xff1a;是从 2022.1版本开始的。 ps&#xff1a;之前有人写过了&#xff0c;感觉很实用但是蛮多开发者不一定会知道的功能。 参考资料&#xff1a; https://www.cnblogs.com/didispace/p/16144107.h…

【docker】maven 打包docker的插件学习

docker-maven-plugin GitHub地址&#xff1a;https://github.com/spotify/docker-maven-plugin 您可以使用此插件创建一个 Docker 映像&#xff0c;其中包含从 Maven 项目构建的工件。例如&#xff0c;Java 服务的构建过程可以输出运行该服务的 Docker 映像。 该插件是 Spot…

【跟马少平老师学AI】-【神经网络是怎么实现的】(九)长短期记忆网络

一句话归纳&#xff1a; 1&#xff09;RNN也会存在梯度消失的问题。 2&#xff09;同一句话&#xff0c;对于不同的任务&#xff0c;句中不同的词起的作用也不一样。 3&#xff09;LSTM&#xff08;长短期记忆&#xff09;子网络&#xff1a; 门&#xff0c;让输入经过运算&…

附录6-4 黑马优购项目-分类和购物车

目录 1 分类 1.1 接口 1.2 窗口限制 1.3 选中状态样式判断 1.4 点击左侧时右侧会到顶点 1.5 源码 2 购物车 2.1 store 2.2 tabBar徽标 2.3 滑动删除 2.4 结算 2.4.1 结算前登录 2.4.2 结算功能 2.5 触发组件事件 2.6 源码 1 分类 分类最上部是…

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术&#xff0c;针对不同的业务/基础功能对模块进行划分&#xff0c;从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块&#xff0c;壳工程依赖业务模块。同级的横向模块&#xff08;比如多个业务…

使用Nuxt3框架搭建基础项目

Nuxt3安装 基础配置: Node.js** - v18.0.0版本以上 , 可以结合fnm工具切换node版本 安装nuxt3命令 打开vscode或者控制台去到项目文件夹输入: npx nuxilatest init <project-name> 国内执行这行代码&#xff0c;即使科学上网也会有问题 ⚠️ 安装Nuxt3报错 安装过程…

数据分析--客户价值分析RFM(K-means聚类/轮廓系数)

原数据 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import metrics ### 数据抽取&#xff0c;读⼊数据 df pd.read_csv("customers1997.csv") #相对路径读取数据 print(df.info()) pr…

如何定时打开网站

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具按下Ctrl3&#xff0c;切换到定时器模块&#xff0c;左侧右键&#xff0c;选择新建 2、标题叫百度&#xff0c;等下就让它打开百度&#xff0c…

Spring - 6 ( 9000 字 Spring 入门级教程 )

一&#xff1a; SpringBoot 配置文件 1.1 配置文件作用 配置文件通常是一个文本文件&#xff0c;其中包含了程序或系统的各种设置、选项和参数。比如C:\Users, C:\Windows 文件夹, 以及各种 .config, .xml 文件 配置文件主要是为了解决硬编码&#xff08;代码写死&#xff0…

排序算法--希尔排序

前提&#xff1a; 排序算法——直接插入排序-CSDN博客 希尔排序(Shell Sort)是插入排序的一种。是直接插入排序算法的Plus版。该方法又称缩小增量排序&#xff0c;是D.L.Shell于1959年提出。要想学好希尔排序&#xff0c;直接插入排序一定要学好&#xff0c;没学过的&#xff0…

chrome extension插件替换网络请求中的useragent

感觉Chrome商店中的插件不能很好的实现自己想要的效果,那么就来自己动手吧。 本文以百度为例: 一般来说网页请求如下: 当前使用的useragent是User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safar…

【Flask 系统教程 4】Jinjia2模版和语法

Jinjia2 模板 模板的介绍 Jinja2 是一种现代的、设计优雅的模板引擎&#xff0c;它是 Python 的一部分&#xff0c;由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码&#xff0c;以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰&#…

java发送请求2次开发-get请求json

因为你请求参数不为空&#xff0c;接口都会把这个参数带上 所以借鉴HttpPost类 继承这个类&#xff0c; 这个类是可以带消息的 httpgetwithentity&#xff0c;httpget请求带上消息 复写 构造方法复制过来进行使用 二次开发类让其get请求时可以发送json

IOS上线操作

1、拥有苹果开发者账号 2、配置证书&#xff0c;进入苹果开发者官网&#xff08;https://developer.apple.com/&#xff09; 3、点击账户&#xff08;account&#xff09;&#xff0c;然后创建一个唯一的标识符 4、点击"Identifiers"&#xff0c;然后点击"&qu…

SpringBoot的ProblemDetails

1.RFC 7807 之前的项目如果出现异常&#xff0c;默认跳转到error页面。或者是抛出500 异常。 但是对于前后端分离的项目&#xff0c;Java程序员不负责页面跳转&#xff0c;只需要 把错误信息交给前端程序员处理即可。而RFC 7807规范就是将异常 信息转为JSON格式的数据。这个…

android init进程启动流程

Android系统完整的启动流程 android 系统架构图 init进程的启动流程 init进程启动服务的顺序 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_…

每天五分钟深度学习框架pytorch:如何创建多维Tensor张量元素?

本文重点 上节课程我们学习了如何创建Tensor标量,我们使用torch.tensor。本节课程我们学习如何创建Tensor向量,我们即可以使用torch.Tensor又可以使用torch.tensor,下面我们看一下二者的共同点和不同点。 Tensor张量 tensor张量是一个多维数组,零维就是一个点(就是上一…

llama-factory/peft微调千问1.5-7b-chat

目标 使用COIG-CQIA数据集和通用sft数据集对qwen1.5-7b-chat进行sft微调,使用公开dpo数据集进行dpo对齐。学习千问的长度外推方法。 一、训练配置 使用Lora方式, 将lora改为full即可使用全量微调。 具体的参数在 该框架将各个参数、训练配置都封装好了,直接使用脚本,将数…