阅读:2739回复:24
俺想请问一下关于驱动程序和进程的关系?
请问:当我们的应用进程想从一个设备中读数据时,它调用ReadFile(),进入了核心,再通过I/O管理器向驱动程序发IRP,驱动程序再完成相应的动作.
俺要问的是:当驱动程序执行时,这个调用进程是继续执行呢?还是阻塞呢?即,驱动程序是作为进程的一个模块来运行呢?还是作为一个单独的进程或线程和应用进程进行交互? 谢谢! |
|
沙发#
发布于:2003-02-24 18:16
回复wwwwwww:那么这个例程是被什么样的机构调度的呢?肯定不是线程调度机构。
首先,内核驱动的I/O例程(statIo, adddevice)是由I/O管理器调度的。 另外说明一点,W2k的多任务,抢占式的实现与Unix不同。并不是存在某一线程调度机构对线程或进程进行调度的。 而是当线程或进程1、阻塞 2、时间片耗尽 3、产生I/O操作等,切换到内核态,执行线程调度片段,产生进程/线程切换。 所以,对于内核例程和应用程序并行执行,应该还是服从与Windows的进程/线程调度机制(注意不是调度机构,准确的讲,Windows没有专门负责调度的系统进程) |
|
板凳#
发布于:2003-02-23 21:27
请问:当我们的应用进程想从一个设备中读数据时,它调用ReadFile(),进入了核心,再通过I/O管理器向驱动程序发IRP,驱动程序再完成相应的动作. NT的抢先多任务不仅表现在用户界面上,在设备驱动级也是抢占和可中断的.在系统中每一个线程都被赋予优先属性,大部分的优先属性都是可变的,除非是实时优先,这种优先只有自己放弃控制.无论优先属性如何,当硬件或某种软件中断产生时,系统中的一些线程将被抢占.核心态对于给定平台的指派中断都定义了中断请求层IRQL,NT核心区分硬件和软件中断优先,一些核心态代码运行于较高的IRQL,例如NT驱动. 列如,当NT驱动初始化时将调用IoCreateDevice一次或数次,为物理,逻辑或虚拟设备创建设备对象。 IO管理器的主要工作是接收IO请求(通常来自于用户模式的应用程序),创建IO请求包,将IRP传递给合适的NT驱动。并且跟踪它们直到完成。并且为每个IO操作的原始请求者返回状态。IO管理器使用IRP和NT驱动通讯,并且允许NT驱动互相之间通讯。要注意的是一些IRP将传递给不止一个NT驱动。例如,在磁盘中打开文件这个请求将首先传到文件系统驱动,经过中间介质的镜像驱动最终传到物理磁盘驱动。因此每一个IRP有一个固定的部分,还有一个或多个IO的位置栈。在固定的部分,IO管理器保持原始请求信息,例如调用者参数,关于哪一个文件打开的设备对象地址,等等。另外在固定的部分还包含IO状态块,其中包含了请求操作的驱动信息。在高级驱动的IO本地栈中,IO管理器设置特殊的参数。 *************IO管理器提供异步IO,这样IRP的请求者能够继续执行,而不是等待IRP完成**************。NT驱动没有必要按照它们传递给IO管理器的顺序处理IO请求。IO管理器或高级驱动在接收时可以重新排列IO请求或将大数据的传输请求分离为小的传输请求。 |
|
|
地板#
发布于:2003-02-23 19:16
那片文章的作者也来这个论坛的,呵呵,其实就在这个论坛,
你用文章搜索就可以找到很多可能对你有用的帖子了。 |
|
地下室#
发布于:2003-02-23 15:24
simba 兄
你介绍的文章的确不错,还有没有什么好文章或好的站点呀?如果有请贡献出来吧 |
|
|
5楼#
发布于:2003-02-23 00:57
In
|
|
6楼#
发布于:2003-02-21 01:05
Is it the question of context of driver routine ?
I want to known when the context is user thread and when is kernel thead too. |
|
7楼#
发布于:2003-01-13 23:40
你的意思是说应用程序和核心例程可以并行运行?那么当返回应用程序了应用程序当然继续执行调用函数的下一条语句.那么,你所说的\"......IRP内有一个完成列程,在IRP完成后,此历程就会被调用,驱动会回到相应的点继续操作......\"也就是这个例程是和应用程序是并行执行的关系,那么这个例程是被什么样的机构调度的呢?肯定不是线程调度机构
|
|
8楼#
发布于:2003-01-13 22:02
这个问题是这样:
接受你请求的驱动一般不会直接读写端口,他会把IRP接着向下发。在向下发的过程中,他返回,也等待此IRP被完成。IRP内有一个完成列程,在IRP完成后,此历程就会被调用,驱动会回到相应的点继续操作。也就是说,在他向下发以后,完成列程还没有执行时,你的readfile可以接到控制。 |
|
9楼#
发布于:2003-01-13 21:50
谢谢你的解答.你所说的俺也能理解.和俺在书上看的一样但是有这么一段话俺觉得值得商洽:
.......其中在请求发出到回调到最后一个completion中间,对于非阻塞,应用程序可以撒手干别的事情,和别的PASSIVE_LEVEL代码并行,....... 在俺学操作系统时,好象记得老师说过:两段代码要并行执行(在单处理机上),只能通过这两段代码在不同的进程或线程中去实现.现在,你说应用程序可以\"撒手干别的事情\",也就是和你所说的1,2,3,4步骤是并行执行的. 但进过上面的讨论大家已经排除了这几步是进程或线程的可能性,那么在WINDOWS2000中是怎么样实现的这几步和应用程序的并行的呢? |
|
10楼#
发布于:2003-01-13 19:58
你好,就我的理解应该是这样的,
1 应用程序调用ReadFile 2 ReadFile调用文件系统驱动的功能,文件系统驱动(FSD)的分派函数运作,创建IRP发送下去 3 IRP到了磁盘类驱动,磁盘类驱动的分派函数对IRP进行处理,包括生成Srb等,并且将请求发送到下层: port/miniPort驱动 4 miniPort驱动操作硬件,作DMA/PIO/...把数据放入buffer 5 返回,一层一层的进行,调用completion routine,最后交到文件系统手上 6 完成 其中在请求发出到回调到最后一个completion中间,对于非阻塞,应用程序可以撒手干别的事情,和别的 PASSIVE_LEVEL代码并行,但是在几个环节,比如miniPort的startIo、中断服务程序、等,由于其IRQL高 (>=DISPATCH_LEVEL),那些低IRQL的代码,显然包括你应用程序的函数和上层驱动的大多分派函数, 运行在PASSIVE_LEVEL上的,将无法运行,这个过程和任务调度没有关系。 |
|
11楼#
发布于:2003-01-13 15:21
是的,打开文件读写是可以选择同步,异步方式。但俺想知道的是问题中的原理。在不选择阻塞方式时,当进入内核执行,假如驱动程序没有完成应用程序所交给的任务,这时会回到应用程序的下一条语句接续执行。那好,俺想知道什么时候,什么情况下驱动程序会接着执行未完成任务?就俺所知,在CPU调度的是线程或进程,而不是例程。驱动程序一般情况下是不能单独作为线程或进程来有机会去运行的,也就是说,不进行系统调用,是无法启动驱动程序的)
以上说法不知道对否,请各位大侠指点!! |
|
12楼#
发布于:2003-01-12 23:33
没错,打开文件读写可以选择同步,异步方式的,决定阻塞与否,事实上用户程序和部分核心驱动代码都在PASSIVE_LEVEL上跑,在同一个IRQL,少数核心例程如StartIo才运行于DISPATCH_LEVEL
|
|
13楼#
发布于:2003-01-12 22:37
使用异步读是不会阻塞的
|
|
14楼#
发布于:2003-01-12 20:18
谢谢你的提议和好文章.俺花了一天时间去看好象有点心得.就IRQL,俺感觉是为在核心中运行的例程之间的关系而设值的.在核心中的例程都可以通过程序员去设置一个合适的IRQL.现在,假如你愿意俺想和你讨论一下驱动程序和IRQL的关系.下面这段话你看对不对:
1.当俺们在应用程序调用一个ReadFile()函数时,发生了软中断系统进入了核心,开始访问设备,取得了数据后,方能返回应用程序,接着执行ReadFile()下一条语句.要是数据没有取到这这个应用程序就阻塞在这条语句上.当时间片完成了,此时系统将驱动程序的当前例程的IRQL和定时器的进行比较,大于就仍然阻塞,小于就开始调度另一个线程执行.不知道这样说对否? 2.要是这样说法是对的.那么,要是俺在执行了ReadFile(),不关心知道设备是否取得数据,想接着执行下一条语句.这时该怎么办俺也想过可在驱动程序中设置同步语句,不过,那时应用程序仍然是阻塞的有没有更好的办法呢? 谢谢! |
|
15楼#
发布于:2003-01-11 00:51
另外,你提到的这些在inside win2000里面都有讲解
|
|
16楼#
发布于:2003-01-10 19:53
建议你到这里看一篇文章,讲的挺清楚的哦
http://sys.xiloo.com/documents/irql.htm |
|
17楼#
发布于:2003-01-10 19:23
老兄,俺给弄糊涂了. 你所说的IRPL是属于系统进程吗?俺只记得核心根据线程的优先级去调度线程,和中断优先级有什么关系?
|
|
18楼#
发布于:2003-01-10 14:15
IRPL就是传说中的中断优先级。在系统进程中,只有在IRQL等于0时,系统会发生线程切换,如果大于0,就不允许更低的IRPL抢先运行。
|
|
19楼#
发布于:2003-01-10 11:38
弱弱的一问:
楼上的老兄,请问IRQL是什么东东? 谢谢! |
|
上一页
下一页