我有个设备上面有 电池 风扇 LED灯,我想写一个windows 驱动 ,这个驱动里 能操作上面的硬件设备,。
问题是关于驱动模型中, 我是一个driver驱动里就创建一个device object 通过这个device 再去操作 上面这些硬件? 还是一个driver里创建多个device object。每个device都对应具体的一个硬件设备? 然后分别去操作这些device,应该怎么选呢?
第一种:
FDO(风扇) FDO(LED) FDO(电池)
PDO(风扇) PDO(LED) PDO(电池)
第二种:
FDO(风扇 LED 电池)
PDO(风扇 LED 电池)
第三种:
FDO(风扇) FDO(LED) FDO(电池)
PDO(风扇 LED 电池)
第二种可以 只有一个设备堆栈,对IRP 处理没有延迟和效率问题
第一种和第三种 有多个设备对象堆栈,面对IRP 穿越延迟效率问题(不知影响是否可以忽略不计) ,但是这两种逻辑清晰
该如何选择呢? 希望写清楚你选择的原因和理由
1 这三种方式其实是一样的,你只用了一个驱动,注册的例程都一样, 不同irq请求到来时执行的例程都是同一个,有何区别
2 你所说的 IRP 处理延迟和效率问题, 这3种方式创建的设备栈都只有两层, 调用效率根本就没有区别
3 第一种方式创建的3个设备对象, 在你没有指定将这3个设备对象挂在到同一个设备栈上时,这3个设备都是相互独立的设备栈, 并且只有1层
这3种方式区别在于
第二种方式创建设备,设备的名称只有一个, 当你在用户空间打开,使用 ioctl 控制 (电池 风扇 LED) 时,你只能在请求时添加参数用来区分三种设备.
第一种和第三种可以为 (电池 风扇 LED) 取不同的设备名称, 这样你可以用设备名称来区分3种设置.
如果让我设计,我会设计3个驱动文件分别对应 电池 风扇 LED 三种设备,而不是你这种将三种设备放到一个驱动里面
如果功能简单,按你的设计我会选择 第一种, 创建不同名称的设备对象来区分三种设备, 就像windows设计的磁盘管理驱动, 设计成设备名称为 C D E 盘这种方式
基于new bing部分指引作答:
在选择驱动模型中,是否创建多个设备对象取决于你的具体需求和设计考虑。以下是对每种选择的解释和一些建议。
第一种:
在第一种模型中,你为每个硬件设备创建一个功能设备对象(Functional Device Object,FDO)和一个物理设备对象(Physical Device Object,PDO)。这种模型具有清晰的逻辑结构,每个设备都有自己的设备对象堆栈,易于管理和维护。然而,这可能会导致处理IRP(I/O Request Packet)时的一些延迟和效率问题,因为IRP需要在多个设备对象之间传递。
第二种:
在第二种模型中,你为所有硬件设备创建一个功能设备对象(FDO)和一个物理设备对象(PDO)。这种模型只有一个设备对象堆栈,可以减少IRP处理的延迟和提高效率。这种模型更简单,可能更适合只有少量硬件设备的情况。
第三种:
第三种模型是第一种和第二种的结合,你为每个硬件设备创建一个功能设备对象(FDO)和一个物理设备对象(PDO),同时还有一个共享的功能设备对象(FDO)用于处理整体设备。这种模型保留了第一种的逻辑清晰性,同时也解决了第一种模型中的延迟和效率问题。但是,这可能会增加一些复杂性和开发工作量。
选择哪种模型取决于你的优先考虑因素。如果对处理延迟和效率非常敏感,第二种模型可能是一个不错的选择。如果你更关注代码的组织和可维护性,第一种模型可能更适合。如果你希望在两者之间取得平衡,第三种模型可能是一个折中的解决方案。
请注意,这只是一些建议,具体选择应基于你的具体需求和优先级。在进行实际开发之前,最好进行更深入的分析和评估,以确保选择的模型符合你的设计目标和要求。
如果硬件是通过单一接口与风扇,LED灯和电池交互的,那么创建一个设备对象(第二种方案)是最简单和最直接的方法。这会允许你的驱动程序统一管理这些设备,通过一个设备堆栈处理IRP。方案的优点是,只有一个设备堆栈,所以在处理IRP时的延迟和效率问题会小一些。缺点是,如果一个设备出现故障或者需要更新,那么整个驱动程序可能都需要更新。
如果你的硬件设备(风扇、LED灯和电池)各自有自己独立的接口,或者各自要执行不同的操作,那么创建多个设备对象(第一种和第三种方案)可能更为合适。这种方式的优点是清晰性和灵活性:每个设备对象可以有其自己的驱动程序,可以独立更新和维护。如果一个设备出现问题,它不会影响其他设备的驱动程序。缺点是这会增加IRP穿越延迟和效率问题。
如果是我的话,我倾向于选择第二种方式,即一个驱动程序中创建一个FDO和一个PDO,负责管理和控制所有硬件设备。这是因为对于你描述的这种简单硬件设备,设备之间的交互较为简单,且功能模块有限。在这种情况下,使用一个设备堆栈可以减少系统开销,提高代码的简洁性和维护性。此外,由于硬件设备不是很复杂,处理IRP请求的延迟和效率问题大多数情况下可以忽略不计。然而,如果这些硬件设备之间存在较为复杂的交互逻辑,或者它们的功能模块和性能需求不同,那么选择第一种方式可能更合适。每个硬件设备都有独立的FDO和PDO,可以更好地进行具体的设备控制和管理。虽然存在一些额外的系统开销和代码复杂性,但这种方式使得每个硬件设备具有更高的独立性和灵活性。在编写和调试驱动程序时,确保遵循相关的驱动程序开发规范和最佳实践,如合理地处理IRP请求、正确管理系统资源和处理错误情况等。
源于chatGPT仅供参考
在选择驱动模型时,可以根据以下几个因素来决定应该使用哪种方式:
1. 设备的功能和关联性:如果风扇、LED灯和电池是完全独立的硬件设备,它们之间没有太多的相互作用,并且与驱动的其他功能也没有太多的交集,那么使用第一种方式每个设备都有自己的FDO和PDO可能更合适。这样可以将不同的设备拆分成独立的对象,使代码更易于管理和维护。
2. 驱动的复杂性和可扩展性:如果设备的功能非常简单,并且预计不会增加更多的硬件组件,那么可以选择第二种方式将所有硬件设备放在一个FDO下,并使用一个共享的PDO进行操作。这样可以减少设备堆栈的复杂性,简化开发和维护过程。
3. 性能要求:第一种和第三种方式可能会引入设备堆栈,从而导致IRP的传递延迟。但是,对于大多数设备来说,这种延迟可以忽略不计。如果对于你的特定设备,实时性和低延迟非常重要,那么可能需要考虑使用第二种方式以降低延迟。
综上所述,根据设备的功能、驱动的复杂性和性能要求来选择合适的驱动模型。如果你对简化开发和维护过程比较关注,同时不需要实时性和低延迟,那么第二种方式可能是一个更好的选择。
请注意,以上建议是基于常见的驱动设计原则和一般情况下的最佳实践。具体选择应该结合你的特定需求和工作环境来决定。
希望这些信息对您有所帮助!如果您有任何其他问题,请随时提问。