阅读:1562回复:8
设备的物理地址如何决定阿?
我想请教一个问题,如何决定MmMapIoSpace中的PhysicalAddress参数啊?在PCI槽上插了一块卡,OS怎么知道这块卡的物理地址的啊?谢谢各位指教!
|
|
最新喜欢:flyfox |
沙发#
发布于:2002-06-13 21:26
是由系统自动分配物理地址的
|
|
|
板凳#
发布于:2002-06-14 09:15
你可以在驱动得到地。
|
|
地板#
发布于:2002-06-14 09:33
通过访问卡的PCI CONFIG SPACE 可以得到
|
|
|
地下室#
发布于:2002-06-14 10:46
谢谢wwx79的指导,可是要调用DDK中的什么函数来取得系统自动分配的物理地址呢?
我看了一下src\\network\\ndis\\ne2000的源代码,它是这样处理的: ne2000hw.h // // Default value for Adapter->IoBaseAddr // #define DEFAULT_IOBASEADDR (PVOID)0x300 ne2000.c IoBaseAddr = DEFAULT_IOBASEADDR; // // Read Bus Type (for NE2/AE2 support) // Adapter->BusType = NdisInterfaceIsa; NdisReadConfiguration( &Status, &ReturnedValue, ConfigHandle, &BusTypeStr, NdisParameterHexInteger ); if (Status == NDIS_STATUS_SUCCESS) { Adapter->BusType = (UCHAR)ReturnedValue-> ParameterData.IntegerData; } ....... NdisReadConfiguration( &Status, &ReturnedValue, ConfigHandle, &IOAddressStr, NdisParameterHexInteger ); ....... if (Adapter->BusType == NdisInterfaceMca) { NdisReadMcaPosInformation( &Status, ConfigurationHandle, &SlotNumber, &McaData ); ....... // // Interpret POS data // if (McaData.AdapterId == AE2_ADAPTER_ID ){ SkipIobaseAndInterrupt = TRUE; switch ((McaData.PosData1 & MC_IO_BASE_MASK)>>1) { case 0x01: IoBaseAddr = (PVOID)0x1000; break; case 0x02: IoBaseAddr = (PVOID)0x2020; break; case 0x03: IoBaseAddr = (PVOID)0x8020; break; case 0x04: IoBaseAddr = (PVOID)0x0300; break; case 0x05: IoBaseAddr = (PVOID)0x0320; break; case 0x06: IoBaseAddr = (PVOID)0x0340; break; case 0x07: IoBaseAddr = (PVOID)0x0360; break; } ....... if (Status == NDIS_STATUS_SUCCESS) { IoBaseAddr = (PVOID)(ReturnedValue-> ParameterData.IntegerData); } ....... Adapter->IoBaseAddr = IoBaseAddr; ....... // // Inform the wrapper of the physical attributes of this adapter. // NdisMSetAttributes( Adapter->MiniportAdapterHandle, (NDIS_HANDLE)Adapter, FALSE, Adapter->BusType ); // // Register the port addresses. // status = NdisMRegisterIoPortRange( (PVOID *)(&(Adapter->IoPAddr)), Adapter->MiniportAdapterHandle, PtrToUint(Adapter->IoBaseAddr), 0x20 ); ....... NdisRawWritePortUchar( Adapter->IoPAddr+NIC_XMIT_CONFIG, TCR_LOOPBACK); 由上面的代码可以知道,NdisReadConfiguration先从注册表中读取(DDK中说:NdisReadConfiguration returns the value of a named entry of the specified type from the registry)IOBaseAddr,然后,再调用NdisMRegisterIoPortRange将输入/输出端口的基地址开始的所有端口映射到base virtual address(DDK中这样说)上去,然后,就可以调用NdisRawWritePortUchar之类的函数对设备的IOPort通过Base virtual address进行读写了。 端口基地址是什么概念呢?它和物理地址有什么关系吗?并且通过上面的代码可以看出,端口基地址甚至可以是一个定值,如缺省值,甚至当网卡总线类型是NdisInterfaceMca时,IoBaseAddr也是通过从注册表中读到的参数判断出来的固定值。问题是,如果是第一次安装网卡,这些信息注册表中不是没有吗?还是说,对某些设备来说是从注册表中查找未用的IoBaseAddr,然后使用呢? 另外还有一个例子src\\network\\ndis\\e100bex,它是一个PCI的网卡适配器的驱动的例子,用到了NdisMMapIoSpace,我现在还在研读。它对物理地址到虚拟地址的映射和上面的例子完全不同,大体上知道是通过读取设备的资源获得的,这些资源,应该在设备中有相应的信息。 以上很多问题,如果那位侠士能给出一个系统的解答,或者是,对这块有什么系统的理解,我自当感激涕零!!如果那里有什么文章,或者是书籍,也请给条明路! 谢谢指教!! |
|
5楼#
发布于:2002-06-14 10:48
谢谢以上各位的指教,我刚刚整理出问题来,就收到了这么多解答,万分感谢!
|
|
6楼#
发布于:2002-06-14 11:18
用端口基地址和物理地址,可以得到两种不同的访问设备的方式.
port IO & memory map IO |
|
7楼#
发布于:2002-06-14 11:32
请问Port Io是不是就是对映射以后的端口进行读写操作啊,
例如NdisRawRead....NdisRawWrite...HalRead....等等,而memory Io就是可操作内存一样,甚至可以用赋值等操作啊? |
|
8楼#
发布于:2002-06-14 11:52
对。
|
|