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

答的好了有79分!!

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

    经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教?
写驱动不如买足彩!!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-25 16:50
用户被禁言,该主题自动屏蔽!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-25 16:57
KeInitializeSpinLock()
KeAcquireSpinLock()
KeAcquireSpinLockAtDpcLevel()
KeReleaseSpinLockFromDpcLevel()
KeReleaseSpinLock()
申请一个KSPIN_LOCK
每次写队列前acquire
写完后release
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-25 17:37
为什么不用信号量呢!建议你去看看windows nt核心驱动程序开发的那本书吧!好象是在第9或者11章有讲的,把请求排队,然后在一个线程里面进行处理的啊
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-25 17:38
队列是你维护的吗?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-25 18:46
 
经过一些尝试,小弟感觉在Dispatch Routine中做WaitForSingleObject似乎不是什么好主意,不知各位老大对此有何指教?

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

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

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

gung老兄,这个你试过吗?顶事吗?
写驱动不如买足彩!!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-07-25 19:22
用户被禁言,该主题自动屏蔽!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-25 19:23
应该可以把,我用于防止中断dpc的重入,有效的,你试试看
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-07-25 19:25
用户被禁言,该主题自动屏蔽!
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-25 19:28
队列写成功就肯定没问题了,用自旋锁使多线程写队列时互斥,这样就不会乱了,不知我对你的问题理解对不对
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-07-25 21:16
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-26 10:04
你创建的这个线程是负责对这个队列的操作啊!并且其他的需要访问该队列的请求全部都排队啊,让这个现成进行处理这个请求啊
gung
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2008-04-21
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-26 10:51
只有StartIo写队列,用不用自旋锁无所谓。
这么简单的道理都不清楚。 :mad:

厄~~~~
说错了,想成是多卡互斥了, :P
还是请楼主说说到底有什么问题吧
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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分
14楼#
发布于: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分
15楼#
发布于:2002-07-26 11:41
gung老兄,对SpinLock兄弟研究不多,但从其含义来看,SpinLock是对SMP系统而设,其拥有权是对CPU而言;就好比Mutex,其拥有权是对线程而言一样,当一个线程已经获得一个Mutex的拥有权时,再去请求,是理所当然可以得到的,也就是说你在一个线程中连续多次做Wait的话,第一次之后的是没有意义的,效果仅是其引用计数增加而已。我想SpinLock情况也该类似吧。兄弟我不敢乱讲,所以请教各位。
写驱动不如买足彩!!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-26 12:14
呵呵,你还是看看我给你说的那本书上面的例子吧,我说的方法可以解决,或者你在本站下载那个filedisk的例子看看吧!
用startio是不可以的,因为iocalldriver的等级是passive,而startio高于这个级别的
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-26 12:15
还有一个问题就是iocalldriver是一个异步函数
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于: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]
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-26 15:39
各位老大,小弟似乎有答案了,待我证明之后向诸位汇报。 ;)
写驱动不如买足彩!!
上一页
游客

返回顶部