阅读:1413回复:6
求教!Asynchronous Procedure Calls
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为何能避免重入呢? |
|
沙发#
发布于:2008-01-13 11:04
据我所知,special kernel apc是指IoCompleteRequest中用来完成某些必须在某个线程中才能完成的清理操作而使用的apc,如果disable special kernel apc的话,可能会导致死锁。
|
|
板凳#
发布于:2008-01-13 11:13
这个我也知道。只是很奇怪为何那样。据我所知,special APC是可以自己调用KeInitializeApc指定KernelMode和置空NormalRoutine参数来投递的,如果某个驱动以这种方式构建一个访问文件系统(派发例程中调用KeEnterCriticalRegion)的special Apc(有没有这种可能?),这样会引起死锁问题吗?还有,系统中除了IoCompleteRequest外,还有别的调用也会用到special APC吗?
|
|
地板#
发布于:2008-01-13 14:07
因为KeEnterCriticalRegion不禁止special kernel apc,所以应该没有问题,如何禁止ska的话,那就有可能了。据我所知除了IoCompleteRequest没有其它的地方用到ska了
|
|
地下室#
发布于:2008-01-13 16:28
好,假设有如下情景:
文件系统驱动正在PASSIVE级别上响应某种卷级别的文件操作a,因此获得了Exclusive的VCB资源,之后,假设系统中另外一个驱动,递交了一个SPECIAL APC也要进行同一个卷的卷级别的文件操作b,由于APC的IRQL级别高,操作a被b抢先,然后派发例程被重入,但是VCB资源无法被独占获得,结果是不是死锁? 以前我理解的IoCompleteRequest不会死锁是因为它绝对不会重入文件系统。而且你提到的“disable special kernel apc的话,可能会导致死锁”能具体分析一下吗?我的想法是不会死锁但是影响性能。 |
|
5楼#
发布于:2008-01-13 22:52
如果是像你描述的那种情景,死锁是必然的。但special apc的使用是有很大限制的,我不认为有谁会理智地在special apc中执行这么复杂的操作。
“IoCompleteRequest不会死锁是因为它绝对不会重入文件系统”,这一点我无法确认,希望有哪位牛人帮我确认这点。 |
|
6楼#
发布于:2008-01-15 13:25
帮顶一个,同求答案
![]() |
|