阅读:1448回复:6
关于资源的问题!
在IO_STACK_LOCATION.Parameters.StartDevice中有两个参数,AllocatedResources包含原始的资源分配信息;
另外一个AllocatedResourcesTranslated包含转换后的资源分配信息; 我想知道这个两个是什么区别,有了转换后的资源分配信息,在进行系统地址映射的时候我还要不要用MmMapIoSpace函数进行映射,得到系统内存地址,还是直接利用转换后的资源。如果要用MmMapIoSpace的话,那么上面为什么还要搞两个资源信息? 还有一个问题是,我们在“设备管理中”看到的设备的\"资源\"一项应该就是分配给该设备的系统地址吧!这样理解对不对? |
|
|
沙发#
发布于:2003-01-22 21:33
如果是memory,那么内存映射是必需的,
如果是io,在x86平台不用映射,否则也需要 设备管理中看到的是映射过的 |
|
|
板凳#
发布于:2003-01-22 21:37
谢谢斑竹了,
我还想知道的是AllocatedResources和AllocatedResourcesTranslated到底有什么区别,他们具体代表什么含义啊? |
|
|
地板#
发布于:2003-01-23 09:15
关注!
|
|
地下室#
发布于:2003-01-23 13:38
参阅walter oney的programming the Windows Driver Model
I/O堆栈单元的Parameters联合有一个名为StartDevice的子结构,该结构包含的配置信息,见表6-2,将被传递到StartDevice辅助函数。 表6-2. IO_STACK_LOCATION.Parameters.StartDevice子结构中的域 域名 描述 AllocatedResources 包含原始的资源分配信息 AllocatedResourcesTranslated 包含转换后的资源分配信息 AllocatedResources和AllocatedResourcesTranslated都是同一种类数据结构的实例,这种数据结构就是CM_RESOURCE_LIST。如果你看到该结构在WDM.H中的声明,你可能认为它是一个十分复杂的数据结构。然而,当用于启动设备的IRP时,仅有一个表项是有用的,即CM_PARTIAL_RESOURCE_LIST,它描述了设备被赋予的所有I/O资源。 可以使用下面语句访问这两个列表: PCM_PARTIAL_RESOURCE_LIST raw, translated; raw = &stack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList; translated = &stack->Parameters.StartDevice.AllocatedResourcesTranslated->List[0].PartialResourceList; raw和translated资源列表是StartDevice辅助函数的实际参数: status = StartDevice(fdo, raw, translated); 因为I/O总线与CPU在寻址物理硬件的方式上不同,所以存在着两种资源列表。raw资源包含总线相关的数值,而translated资源包含系统相关的数值。在WDM出现之前,内核模式驱动程序从注册表、PCI配置空间、或其它地方获取raw资源值,并通过调用诸如HalTranslateBusAddress或HalGetInterruptVector函数转换这些数值。参见Art Baker的《The Windows NT Device Driver Book: A Guide for Programmers (Prentice Hall, 1997)》第122-162页。现在,接收和转换工作全部由PnP管理器来完成,WDM驱动程序需要做的仅是访问设备启动IRP的Parameters结构。 |
|
|
5楼#
发布于:2003-01-23 14:20
版主,我就是看了这个后不太明白的。
translated资源已经包含系统了相关的数值,为什么还要对它进行映射啊? |
|
|
6楼#
发布于:2003-02-08 18:34
这种转换是对于不同的CPU而言,i386、Alpha、PowerPC的地址映射方式是不同的。对于i386,IO空间和存储空间是分开编址的,对于Alpha,IO空间和存储空间是统一编址的,没有专门的IO寻址空间及其命令,为了保证设备与机器无关,根据PCI规范,PCI的空间是任意IO或Mem的,如果分配了IO空间就需要转换;另外Alpha的寻址方式是邮政编码式的从CPU出来的地址不是直接的物理地址,也就是说设备的逻辑地址(BIOS回写给设备配置空间的空间首地址及其范围)与CPU的寻址地址是不同的,所以要进行转换。对于i386,转换前后是一致的。所以转换是为了保证驱动的跨机器平台性。
|
|