阅读:1968回复:13
ddk开发中如何实现linux中schedule()的功能?
请教大家:
我知道在linux中有schedule()函数,但我不知道win kernel中是否 也有类似函数可以使用,如果没有,用什么方法可以实现schedule的 功能? 谢谢 |
|
沙发#
发布于:2005-03-28 10:14
work item或dpc可能可以达到你的要求
|
|
板凳#
发布于:2005-03-28 13:23
我就是不想让一个循环阻塞执行,也就是在循环过程中可以将权利交给os!
to arthurtu: 首先感谢您的回答! 我目前对dpc的理解仅仅是用来处理interrupt中比较复杂的部分,但 不知如何实现schedule的功能? 另外,work item是什么? 谢谢! |
|
地板#
发布于:2005-03-28 13:41
找到了!关于work item
引用:可以排队一个工作项(work item),之后这个工作项会请求回调驱动程序中的例程。回调将发生在PASSIVE_LEVEL级,在由操作系统所拥有的一个worker线程的上下文中运行。使用工作项(work item)可以避免自己创建仅偶尔醒来的线程的麻烦。 但我不明白如何用work item 实现schedule()的功能? 感觉work item 与dpc有点类似,它们之间的区别是什么呢? 谢谢! |
|
地下室#
发布于:2005-03-28 15:13
找到了!关于work item DPC的IRQL高,work item工作在核心线程上下文,IRQL低 |
|
|
5楼#
发布于:2005-03-29 08:34
原来如此,谢谢bmyyyud
|
|
6楼#
发布于:2005-03-29 10:56
不好意思,我无知,误导你了 :(
|
|
7楼#
发布于:2005-03-29 14:50
不好意思,我无知,误导你了 :( 谈不上\"误导\"!您都\"无知\"啊,那我......唉! 谢谢arthurtu 谁还想说两句!大家没有遇到这种情况吗? 比如说:一个死循环,直到某变量改变才退出循环,而使变量改变是在中断中触发,大家说在循环过程中是不是最好schedule,还是无所谓?在ddk中如何实现?? 谢谢! |
|
8楼#
发布于:2005-03-29 20:28
死循环?是要等某个事件发生吗?
你是不是不想在内核死循环以至于阻塞内核? windows下内核也是可以抢先的,如果级别不高的话,照样调度,无须你操心 |
|
9楼#
发布于:2005-03-30 10:08
谢谢arthurtu
我刚才试了一下,在linux下死循环将阻塞整个系统,而ddk中死循环不会将windows完全阻塞掉,但系统运行很慢,这就是可抢先和不可抢先的区别吧?请大家确认一下! 再请教个刚才遇到的问题,在windows下由于driver中死循环,我不知如何退出driver,不得已reset机器,但重启后,windows仍然运行很慢,这是不是因为刚才的那个driver又自动加载的缘故?正规方法应如何处理这种情况?进入安全模式手工删除sys文件吗? 再就是,windows启动时是不是顺序加载每个驱动,如果发现新硬件,是不是直到你安装该硬件的驱动或取消安装该硬件的驱动后才继续加载另一个设备驱动?因为我发现如果不取消另一硬件的驱动安装(说明:我的机器上安了一个板子从来没有 装过驱动,所以每次开机时都提示发现新硬件,我一般都取消安装),那个死循环的driver就不会运行,一取消,系统立即慢了!请大家确认一下这个问题! 真不好意思,又问了这么多问题,分少了点! 谢谢! :) |
|
10楼#
发布于:2005-03-30 10:53
很慢?那看具体情况了。不知道你是在什么环境下“死循环”的(再汗一下),是在DriverEntry吗?
无需safe mode,直接删除sys文件也可以的,或者你停止这个驱动。 |
|
11楼#
发布于:2005-03-30 11:51
是在DriverEntry中
运行太慢直接删除sys也很累 如何停止这个驱动? 谢谢 |
|
12楼#
发布于:2005-03-30 12:10
不知道你为什么要在DriverEntry“死循环”
DriverEntry都没有完呢,谈不上停止驱动 |
|
13楼#
发布于:2005-03-30 13:27
再次感谢arthurtu的帮助!
是这样,我在DriverEntry“死循环”只是为了测试一下windows内核是不是完全被阻塞了,就加了一句while(1).结论是没完全阻塞,但运行很慢! 而在linux下while(1)会将整个kernel阻塞掉.这就是可抢先和不可抢先的区别吧! 加在DriverEntry中只是随便加的,图个方便!没想到又引出上述的几个问题,请大家再指教一下,谢谢! |
|