SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2606回复:23

答的好了有79分!!

楼主#
更多 发布于:2002-07-25 16:31
内核同步问题:
    假设内核维护一个队列,有两个系统线程写队列,同时会有多个用户态进程通过DeviceIoControl向队列中写东西,怎样在内核做好互斥?
    各位老大如果有确信有效、健壮的方法,小弟60分送上,79分也可。请不吝赐教!

    经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教?
写驱动不如买足彩!!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-02 22:00
呵呵!用信号量比用event要好,特别是当进栈的比出栈的快的时候
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-02 10:30
 
哦!不知道你使用了什么方法呢,但是我说的方法是肯定可以的


你老大说的对,其实大伙儿说的办法都很好,当然,gung老兄对SpinLock的理解小弟觉得还是不对,小弟始终认为上面对gung老兄的关于SpinLock的解释是有点道理的,如认为不对或讲的不合适,请不吝赐教,谢了!

这个问题小弟一开始的做法就没问题,至于分发例程中的Wait,由于和用户态交互,有时候是得小心些,对于队列的处理,像FileDisk中用Event通知没问题,但感觉用Semaphore更好。

Tom老哥说的办法也很好,只是小弟这里好像不用写StartIo也可以解决问题。

小弟最终发现出问题的是在一个傻逼Dll中,小弟的用户态程序要通过那个傻逼Dll访问下面,没办法,只好帮人改Dll了,靠~

多谢各位老大帮忙,也多谢gung哥们帮忙。小分送上!


怎么给不了分了?说什么我不是此帖的发起人或此帖已经给分!
faint!
三位来我的新帖里领分吧,不好意思。

[编辑 -  8/2/02 by  TonyHuyan]

明白了,不知道为何在帖子上方点“会员登录”时要给个“保持登录天数”,默认还是10天!请问管理员,这有什么意义吗?我估计好多人遇到过给不了分的情况,都是这个原因!

[编辑 -  8/2/02 by  TonyHuyan]
写驱动不如买足彩!!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-26 23:21
哦!不知道你使用了什么方法呢,但是我说的方法是肯定可以的
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-26 15:41
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。
届时定有分值送上。 ;)
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-26 15:39
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。 ;)
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-26 12:21
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧!
用startio是不可以的,因为iocalldriver的等级是passive,而startio高于这个级别的


guardee老兄,你说的那本书我了解,你说的方法和我的一样,问题就从这儿来。用StartIo倒是不存在Irql的问题,我前面说的是在StratIo中Push,在一个系统线程中Pop并处理,包括调用IoCallDriver。正因为IoCallDriver是异步函数,需要Wait,所以才只能在Passive Level做。

P.S.
不过好像也应该有问题,同步StartIo和别的调用,自然也得Wait,那该怎么办?

[编辑 -  7/26/02 by  TonyHuyan]
写驱动不如买足彩!!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-26 12:15
还有一个问题就是iocalldriver是一个异步函数
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-26 12:14
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧!
用startio是不可以的,因为iocalldriver的等级是passive,而startio高于这个级别的
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-26 11:41
gung老兄,对SpinLock兄弟研究不多,但从其含义来看,SpinLock是对SMP系统而设,其拥有权是对CPU而言;就好比Mutex,其拥有权是对线程而言一样,当一个线程已经获得一个Mutex的拥有权时,再去请求,是理所当然可以得到的,也就是说你在一个线程中连续多次做Wait的话,第一次之后的是没有意义的,效果仅是其引用计数增加而已。我想SpinLock情况也该类似吧。兄弟我不敢乱讲,所以请教各位。
写驱动不如买足彩!!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-26 11:12
 
我感觉SpinLock不是用来互斥线程的,而且也做不到,甚至当一个CPU拥有SpinLock时,再去请求该Lock的拥有权,有时候是会出问题的

会吗?我把它用来做多卡中断dpc访问资源时的互斥,由于没有出过问题,也不知是没有出现过冲突,还是spinlock在起作用,没有仔细测试过,不敢乱说,不过M$给出这个东东应该就是有用的吧,你说的会出问题是知什么呢?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-26 10:54
只有StartIo写队列,用不用自旋锁无所谓。
这么简单的道理都不清楚。 :mad:

Tom老大,多谢指点,不过还请再帮小弟分析分析。

    情况是这样的:我现在有个驱动,它接受上层的DeviceIo操作,同时又在内核导出函数,让其它驱动从内核直接调用。对上层DeviceIo和内核调用,该驱动都是将数据稍加处理后调用IoCallDriver访问下层驱动,这里必须同步对下层驱动的访问。我的想法是将所有请求的数据写入队列(或链表),然后启动一个系统线程Pop数据进行处理(包括IoCallDriver)。我是在Dispatch中和内核调用中做Push动作(写队列),这时候同步出了问题。

    请老大帮忙看看

    1.我的想法是否合理?

    2.是否有必要写StartIo Routine?

    3.由于我Push入队列的东西不一定是Irp,不知IoStartPacket是否可以在我前面说的内核调用中处理不是Irp的东西?

    4.当然,我可以对上层的调用使用IoStartPacket后在StartIo中做Push动作,这时我也必须同步StartIo和内核调用中的Push动作,这时候的同步和我之前做的内核Push和Dispatch中Push有无不同?是否也会出现问题?(如果可以的话,问题似乎就解决了)

    5.另一个问题请教,对哥们gung说的,我感觉SpinLock不是用来互斥线程的,而且也做不到,甚至当一个CPU拥有SpinLock时,再去请求该Lock的拥有权,有时候是会出问题的,不知小弟的理解是否有理?

    6.还是我之前强调过的,在Dispatch Routine中做Wait动作,是否会有问题?因为我觉得这里做Wait似乎会对用户态的动作有影响,不知老大对此有何看法?



[编辑 -  7/26/02 by  TonyHuyan]
写驱动不如买足彩!!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-26 10:51
只有StartIo写队列,用不用自旋锁无所谓。
这么简单的道理都不清楚。 :mad:

厄~~~~
说错了,想成是多卡互斥了, :P
还是请楼主说说到底有什么问题吧
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-26 10:04
你创建的这个线程是负责对这个队列的操作啊!并且其他的需要访问该队列的请求全部都排队啊,让这个现成进行处理这个请求啊
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-07-25 21:16
用户被禁言,该主题自动屏蔽!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-07-25 19:28
队列写成功就肯定没问题了,用自旋锁使多线程写队列时互斥,这样就不会乱了,不知我对你的问题理解对不对
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-07-25 19:25
用户被禁言,该主题自动屏蔽!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-25 19:23
应该可以把,我用于防止中断dpc的重入,有效的,你试试看
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-07-25 19:22
用户被禁言,该主题自动屏蔽!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-25 18:46
 
经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教?

不知各位老大有没有注意小弟上面这句话。

guardee老兄,如果用两个信号量做个生产者消费者模型,对单进程的访问当然是没有问题,多个用户态进程的情况肯定不是这么简单,(抱歉,内核多线程的情况我还没顾的试),我还是感觉在Dispatch Routine做Wait是不是有问题?或者是什么别的原因?

 
KeInitializeSpinLock()
KeAcquireSpinLock()
KeAcquireSpinLockAtDpcLevel()
KeReleaseSpinLockFromDpcLevel()
KeReleaseSpinLock()
申请一个KSPIN_LOCK
每次写队列前acquire
写完后release

gung老兄,这个你试过吗?顶事吗?
写驱动不如买足彩!!
上一页
游客

返回顶部