ostrich
驱动牛犊
驱动牛犊
  • 注册日期2002-02-20
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1493回复:4

资源分配的一个问题

楼主#
更多 发布于:2002-08-03 16:56
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,没有这种情况发生),还请各位指点一下。
ostrich
驱动牛犊
驱动牛犊
  • 注册日期2002-02-20
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-03 17:08
另外还有一个问题,象这种事先用inf文件分配资源的方法,能不能分配内存,如果能分配内存,是如何指定的,是给出物理地址,还是虚拟地址,怎么知道这一块目前没有被用掉。
还有对于一个硬件设备,对其操作,是不是要么只能映射到内存,要么只能映射到io,能不能两者都使用呢?(因为从上面的程序看来,好象不行)

chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-03 21:44
用INF手工分配资源一般是非PNP设备,当然要自己避免资源冲突,其分配的资源一般是由硬件规定,当然是物理地址,同时运用IO和MEM空间当然也是可以的
ostrich
驱动牛犊
驱动牛犊
  • 注册日期2002-02-20
  • 最后登录2007-06-18
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-04 14:01
那什么时候发生分配io也需要运用MmMapIoSpace的情况呢?这位朋友知道吗?
chnh
驱动小牛
驱动小牛
  • 注册日期2002-04-09
  • 最后登录2004-02-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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
游客

返回顶部