william868
驱动牛犊
驱动牛犊
  • 注册日期2003-03-28
  • 最后登录2009-04-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1414回复:6

求教!Asynchronous Procedure Calls

楼主#
更多 发布于:2008-01-13 01:23
1. 看OSR文档 “Asynchronous Procedure Calls in NT”,对以下一段话有点不解
“For example, suppose that I/O to some file, say X, has just completed. If a kernel APC for the same thread
(a common case) then starts I/O on a different file, say Y, it is possible a deadlock condition could result.
Indeed, even if the FSD developer has defined a locking order between files X and Y, the introduction of
code written outside the FSD’s control might not obey those rules.”
有无高手能解释一下以上这段话,最好能具体点,比如说何种 I/O 操作“to some file, say X”,为何文中提到的情形是“just completed”,又是如何引发 Kernel APC

2. 写文件系统驱动时,通常在Dispatch函数里会调用KeEnterCriticalRegion来disable normal kernel APC,为何不用disable special kernel apc呢?搜索了一下,有人说是文件系统重入问题,可是special apc为何能避免重入呢?
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2008-01-13 11:04
据我所知,special kernel apc是指IoCompleteRequest中用来完成某些必须在某个线程中才能完成的清理操作而使用的apc,如果disable special kernel apc的话,可能会导致死锁。
william868
驱动牛犊
驱动牛犊
  • 注册日期2003-03-28
  • 最后登录2009-04-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-13 11:13
这个我也知道。只是很奇怪为何那样。据我所知,special APC是可以自己调用KeInitializeApc指定KernelMode和置空NormalRoutine参数来投递的,如果某个驱动以这种方式构建一个访问文件系统(派发例程中调用KeEnterCriticalRegion)的special Apc(有没有这种可能?),这样会引起死锁问题吗?还有,系统中除了IoCompleteRequest外,还有别的调用也会用到special APC吗?
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-01-13 14:07
因为KeEnterCriticalRegion不禁止special kernel apc,所以应该没有问题,如何禁止ska的话,那就有可能了。据我所知除了IoCompleteRequest没有其它的地方用到ska了
william868
驱动牛犊
驱动牛犊
  • 注册日期2003-03-28
  • 最后登录2009-04-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-13 16:28
好,假设有如下情景:
文件系统驱动正在PASSIVE级别上响应某种卷级别的文件操作a,因此获得了Exclusive的VCB资源,之后,假设系统中另外一个驱动,递交了一个SPECIAL APC也要进行同一个卷的卷级别的文件操作b,由于APC的IRQL级别高,操作a被b抢先,然后派发例程被重入,但是VCB资源无法被独占获得,结果是不是死锁?

以前我理解的IoCompleteRequest不会死锁是因为它绝对不会重入文件系统。而且你提到的“disable special kernel apc的话,可能会导致死锁”能具体分析一下吗?我的想法是不会死锁但是影响性能。
AlexSho
驱动牛犊
驱动牛犊
  • 注册日期2008-01-10
  • 最后登录2017-12-01
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望164点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-01-13 22:52
如果是像你描述的那种情景,死锁是必然的。但special apc的使用是有很大限制的,我不认为有谁会理智地在special apc中执行这么复杂的操作。

“IoCompleteRequest不会死锁是因为它绝对不会重入文件系统”,这一点我无法确认,希望有哪位牛人帮我确认这点。
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-01-15 13:25
帮顶一个,同求答案
游客

返回顶部