阅读:1493回复:4
资源分配的一个问题
chris cant 书的wdmio这个例子中,有关于资源分配的一段程序是这么写的
inf文件中是 [WdmIo.LogConfig] ConfigPriority=NORMAL IOConfig=378-37a IRQConfig=7,5 在PnpStartDeviceHandler函数(处理pnp消息IRP_MN_START_DEVICE)中调用用NTSTATUS RetrieveResources( IN PWDMIO_DEVICE_EXTENSION dx, IN PCM_RESOURCE_LIST AllocatedResourcesTranslated)函数获取资源 . . case CmResourceTypePort: if( dx->GotPortOrMemory) { GotError = true; break; } dx->GotPortOrMemory = true; dx->PortStartAddress = resource->u.Port.Start; dx->PortLength = resource->u.Port.Length; dx->PortNeedsMapping = (resource->Flags & CM_RESOURCE_PORT_IO)==0; dx->PortInIOSpace = !dx->PortNeedsMapping; . . case CmResourceTypeMemory: if( dx->GotPortOrMemory) { GotError = true; break; } dx->GotPortOrMemory = true; dx->PortStartAddress = resource->u.Memory.Start; dx->PortLength = resource->u.Memory.Length; dx->PortInIOSpace = false; dx->PortNeedsMapping = true; . . 程序后面用了 if( dx->PortNeedsMapping) { dx->PortBase = (PUCHAR)MmMapIoSpace( dx->PortStartAddress, dx->PortLength, MmNonCached); . . 那么这么看来,如果分配了内存,就一定要用MmMapIoSpace转换地址,但是如果只分配了io,也可能出现要转化的情况,也就是(resource->Flags & CM_RESOURCE_PORT_IO)==0的情况,那这种情况什么时候发生呢(因为使用这个驱动程序要先将并口的驱动删除,然后指定使用并口的端口378-37a,没有这种情况发生),还请各位指点一下。 |
|
沙发#
发布于:2002-08-03 17:08
另外还有一个问题,象这种事先用inf文件分配资源的方法,能不能分配内存,如果能分配内存,是如何指定的,是给出物理地址,还是虚拟地址,怎么知道这一块目前没有被用掉。
还有对于一个硬件设备,对其操作,是不是要么只能映射到内存,要么只能映射到io,能不能两者都使用呢?(因为从上面的程序看来,好象不行) |
|
板凳#
发布于:2002-08-03 21:44
用INF手工分配资源一般是非PNP设备,当然要自己避免资源冲突,其分配的资源一般是由硬件规定,当然是物理地址,同时运用IO和MEM空间当然也是可以的
|
|
地板#
发布于:2002-08-04 14:01
那什么时候发生分配io也需要运用MmMapIoSpace的情况呢?这位朋友知道吗?
|
|
地下室#
发布于:2002-08-04 19:28
端口资源的描述符有一个Flags成员,如果CPU支持分离的I/O地址空间,而这个给定端口又属于这个空间,那么这个标志将有CM_RESOURCE_PORT_IO设置。
如果没有设置CM_RESOURCE_PORT_IO标志,这可能是在一个Alpha平台或其它RISC平台上,你必须调用MmMapIoSpace函数来获得能访问该端口的内核模式虚拟地址。访问将真正使用内存引用,但在驱动程序中你仍要调用HAL中的PORT风格的例程(如READ_PORT_UCHAR)。 如果设置了CM_RESOURCE_PORT_IO标志,这将在一个x86平台上,因此你不必映射端口地址。所以,在你的驱动程序中你应该使用PORT风格的HAL例程访问设备端口。HAL例程要求一个PUCHAR类型的端口地址参数,因此我们需要把基地址强制转换成这个类型。QuadPart引用将使你得到一个与编译平台相适应的32位或64位指针。 by Walter Oney |
|