PCIE 快速仿真

  • 前言
  • 工具准备
  • 开发流程

前言

在Windows下开发PCIe驱动通常会用到winDriver这种第三方工具,对于实时要求高的应用就得利用winDriver Kernel Plugin,实测在这种方式的PCIE MSI中断处理在Windows下可以保证2ms(和硬件平台有关系)以内的实时响应,如果是Leagcy 中断处理会慢一些。如果此时的响应速度依然达不到要求,就得自己开发内核驱动来优化。

工具准备

dseo13b.exe

ddk_make.bat (winDriver\util 文件夹下)

Driver_Wizard 生成Kernel_Plugin的工程

开发流程

找到无法满足性能的代码部分,通常是中断处理
生成
对xxx.sys驱动签名
用户层开发驱动
将性能关键代码移到Kernel Plugin
xxx.sys
安装

winDriver提供的Kernel Plugin的开发方式可以理解为一系列的内核回调函数,最终用户是来编写这些回调函数的具体内容。当你在用户层调用某些WDC_XX的函数,就会触发这些在内核执行的回调函数。

编写完成后利用ddk_make.bat 后会生成 xxx.sys文件,在windows7下对于sys的文件安装是需要数字签名的,如果没有签名就得利用这个dseo13b.exe工具签名后,在测试模式下安装。

以kp_pci为例,在winDriver\samples\pci_diag

这些函数是用户需要编写的内核回调函数的函数声明。

BOOL __cdecl KP_PCI_Open(KP_OPEN_CALL *kpOpenCall, HANDLE hWD, PVOID pOpenData,PVOID *ppDrvContext);
void __cdecl KP_PCI_Close(PVOID pDrvContext);
void __cdecl KP_PCI_Call(PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall,BOOL fIsKernelMode);
BOOL __cdecl KP_PCI_IntEnable(PVOID pDrvContext, WD_KERNEL_PLUGIN_CALL *kpCall,PVOID *ppIntContext);
void __cdecl KP_PCI_IntDisable(PVOID pIntContext);BOOL __cdecl KP_PCI_IntAtIrqlMSI(PVOID pIntContext, ULONG dwLastMessage,DWORD dwReserved);
DWORD __cdecl KP_PCI_IntAtDpcMSI(PVOID pIntContext, DWORD dwCount,ULONG dwLastMessage, DWORD dwReserved);

其中最重要的两个回调函数,函数的具体使用请参考Windriver手册

  • KP_PCI_Call,用来user和kernel数据交互的重要函数
  • KP_PCI_IntAtIrqlMSI 用来处理MSI的高优先级中断函数,在此函数内,实测能够保证2ms的实时性。

如果不想触发KP_PCI_IntAtDpcMSI函数只需要在 KP_PCI_IntAtIrqlMSI 内 return FALSE 就可以了,这样你的所有中断代码都只在KP_PCI_IntAtIrqlMSI 高优先级中断处理,(从而保证实时性),也就没有KP_PCI_IntAtDpcMSI以及WDC_IntEnable函数在User层使能中断回调函数的返回了

WinDriver Kernel Plugin开发相关推荐

  1. CRM中Plugin开发如何将功能放入多个模块

    近期做CRM的Plugin开发,发现Plugin中的功能必须全部放在一个DLL里,感觉不爽,如果我要用的功能在别人提供的DLL里,或有些功能需要在多个地方使用岂不是很难过? 用了VS2012的Dyna ...

  2. Flutter Plugin开发流程

    这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...

  3. 通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (三)—— repeater plugin 开发

    本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人.先后在PP助手.PPmoney.荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累. ...

  4. Kernel 社区 开发准备工作mutt 邮件使用

    前言 Rust 的引入 对社区来说 是个 长期 且 可以从头 构建 kernel 的过程,这是一个很好的机会 日常的驱动开发,对工作有很大的好处,尤其是,最新的硬件抽象接口,和硬件协议 安装 mutt ...

  5. YUI3下widget的plugin开发

    最近在尝试使用YUI3重建ExtFrame框架,使用YUI3做为更佳的UI和JS支持 和ExtJS比,YUI3的UI看起来缺少了足够的UI控件,但是,YUI3的widget开发更灵活(也更难掌握),Y ...

  6. skywalking plugin 开发初探 ONS plugin 实践

    最近支持一下 ONS 内部skywalking 增强支持,RocketMQ 开源版本支持skywalking ,阿里云上的skywalking不支持 简单的实现一下,了解整个实现的逻辑. 一.开发指南 ...

  7. Flutter插件(Plugin)开发 - Android视角,flutter安装视频

    // 上报播放器的状态的EventChannel EventChannel status_channel = new EventChannel(registrar.messenger(), " ...

  8. 搭建maya2015 API C++ plugin开发环境

    1.从maya2015安装路径下复制安装包和工程向导到VisualStudio对应的目录. (根据maya版本最好选择对应版本的VisualStudio环境,这样能确保编译的插件能在项目要求的maya ...

  9. 搭建maya2015 maya2017 API C++ plugin开发环境

    第一步:从maya2015安装路径复制开发需要的文件到Visual Studio对应的目录. (根据Maya版本最好选择对应的vs版本,才能保证编译的插件不出差,具有良好的兼容性.当然高手可以修改一些 ...

  10. jQuery plugin 开发的一个例子

    测试代码: <html> <script src="jquery_1.7.1.js"> </script> <script>jQue ...

最新文章

  1. 【Live555】live555源码详解(七):GenericMediaServer、RTSPServer、RTSPClient
  2. C# 仿金山毒霸启动和关闭淡入淡出效果
  3. PowerShell2.0之维护网络(一)查看网络设置
  4. 云炬随笔20171213
  5. android+静态密钥,Android - 更安全地保存静态密钥
  6. 前端知识点梳理(二)
  7. 荣耀6plus+android5.1,荣耀66Plus EMUI3.0开发版5.5.1版本发布说明
  8. cstring移除指定字符串_从String中移除空白字符的多种方式!?差别竟然这么大!...
  9. 使用phpqrcode来生成二维码/thinkphp
  10. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT
  11. (转)金融信息服务业的国际国内竞争格局及新动向
  12. Linux中/etc/rc开头文件详细解释
  13. PAT Basic Level 1072 开学寄语 (20 分)
  14. 内录音频(Windows系统)
  15. 17种最重要的项目管理方法
  16. matlab 打开文件bin
  17. TIFF图像文件格式与实例分析
  18. 互联网“诸神”的排位赛,2016年会是转折点?
  19. ROS2编程基础课程--库
  20. python--format

热门文章

  1. QT学习记录:编译错误“no matching function for call toXXX“
  2. BIM标准化系列写作思路
  3. PSX 610G 使用说明书
  4. AutoCAD 命令定义
  5. 罗辑思维:怎么样成为一个高手 文字版
  6. 7,Matlab实现末端轨迹跟踪
  7. Cisco Packet Tracer中配置链路聚合
  8. mysql5.6卸载干净_Mysql完全干净卸载教程
  9. 桌面计算机系统安装系统文件,电脑重装系统后还原桌面文件步骤
  10. Python爬取淘宝商品附加cookie修改