zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1590回复:13

救急!!!!

楼主#
更多 发布于:2001-12-11 17:18
我是个驱动程序开发新手,最近需要开发由I/O中断驱动的PCI卡的驱动程序,但是我一直没有弄明白,读、写IRP和中断如何协调的工作的原理,望那位大哥,能够详细的解释一下中断与读写端口的工作机制。不慎感激!!
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-12-11 18:46
找两本书看看,比如说Art Baker,Walter Oney的。
Jackal
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-11 18:46
这个网站上也应该有很多相关文章。
Jackal
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-11 19:42
我的英文不是很好,那本书我看过,但是没有弄明白。
关键是在产生中断后,中断例程如何转换去处理读和写IRP。
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-12-12 12:43
Search in this site, and download a Chinese version of Walter Oney\'s book.
Jackal
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-12-12 13:54
我是这样作的:
1)应用发出读写请求。
2)驱动程序的分发例程(Dispatch)接到请求后,判断参数和设备状态,如果参数和设备状态不对(数据缓冲区太小。。。),返回失败。否则将IRP排队(传给StartI/O)
3)StartI/O收到IRP后,判断是读还是写,分别设置寄存器并启动DMA传输。
4)DMA传输完成后,硬件产生中断,系统调用中断服务程序。因为传输已经完成,所以中断服务很简单只要清中断,并将当前的IRP传给DPC
5)DPC被调用后完成最后的清理工作,完成当前IRP,启动队列中的下一个IRP
leerom
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-12-12 14:02
我的卡不需要DMA传输,只是简单的通过端口的读写来收发数据。其中一个中断通知读数据,另一个中断通知写数据(这是通过同一中断向量)。如何做了?
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-12-12 16:16
我们所开发的卡是基于PCI总线,并且是采用端口I/O的方式,不需要DMA方式。当读中断产生时,完成读IRP产生;当写中断产生时,完成写IRP。
我现在不明白在那里完成这些IRP,是在延迟过程调用例程中,还是在StartIo中。望各位大虾给些指点。
能不能给我个OICQ号码,当面咨询一下。
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-12-12 18:17
你可以在StartIo中用IOConnectInterrupt注册一个中断服务例程,如果你所要做的处理不是很复杂的话,就全都在ISR里处理就成,否则把一些不是非常重要且占用处理时间的代码放在DPC里处理。
Jackal
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-12-12 20:49
如果在ISR中处理,那如何将用户应用程序的数据传递到ISR中去,那又如何协调IRP队列与ISR的关系了?
leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-12-12 21:00
我觉得你应该先将你对驱动程序的调用方法说清楚,是应用发出读写请求给驱动还是由驱动通知应用程序有数据可读或可写
leerom
mydrive
驱动牛犊
驱动牛犊
  • 注册日期2001-06-21
  • 最后登录2004-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-12-12 22:04
你可以在内核中申请两块内存作为读、写缓冲区,中断调用和用户Read、Write请求都是对缓冲区进行操作。
另外要注意,在中断到来的时候,有可能没有IRP在排队。
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-12-12 22:12
我给大家讲一下我的思路,看我想的对不对:
我们的卡非常简单,不需要DMA传输,只是简单的通过读写端口来收发数据。其中一个中断通知读数据,另一个中断通知写数据(这是通过同一中断向量)。
1。首先应用程序调用ReadFile或WriteFile,I/O管理器产生IRP_MJ_READ或者IRP_MJ_WRITE.
2.然后驱动程序根据这些IRP,转发到相应的分发例程中去.比如
DISPATCHREAD或者DISPATCHWRITE.
3.为了简单,我们假设驱动程序使用设备对象的IRP队列进行管理.
那么在这些分发例程中,首先判断设备状态读写中断标志位,如果没有得到应该拥有的中断标志位,就说明设备忙,那么将该IRP排队(传给StartI/O),我们简单标记IRP,
  IoMarkPacket(IRP);
  IoStartPacket(IRP);
将这些IRP发送到标准的StartIo例程中,等待处理.
如果获得了中断标志位,那么立刻处理.
4.硬件产生中断,系统调用中断服务程序。中断服务清除中断,并将当前的IRP传给DPC
5)DPC被调用后完成最后的清理工作,完成当前IRP,启动队列中的下一个IRP


leerom
驱动小牛
驱动小牛
  • 注册日期2001-06-08
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-12-13 09:44
我觉得你应该先看看“中断请求级”的部分。
   DispatchRead和DispatchWrite在PASSIVE_LEVEL,StartI/O在DISPATCH_LEVEL,根据NT的规则:“一旦某CPU执行在高于PASSIVE_LEVEL的IRQL上时,该CPU上的活动仅能被拥有更高IRQL的活动抢先”,所以你不必在Dispatch中判断中断位。而是应该将IRP直调用IoMarkPacket(IRP)和IoStartPacket(IRP),如果Device对象的等待请求队列为空系统调用StartI/O例程进行数据传输,否则系统将IRP排队。当传输完成后硬件产生中断,然后是清中断,启动下一个IRP。这是标准的驱动程序模型,因为它每次只能处理一个IRP所以它是半双工的工作方式。如果你要支持全双工的方式,你可能需要建立自己的等待队列。
leerom
游客

返回顶部