sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1562回复:8

设备的物理地址如何决定阿?

楼主#
更多 发布于:2002-06-13 18:38
我想请教一个问题,如何决定MmMapIoSpace中的PhysicalAddress参数啊?在PCI槽上插了一块卡,OS怎么知道这块卡的物理地址的啊?谢谢各位指教!

最新喜欢:

flyfoxflyfox
沙漠之鹰
驱动大牛
驱动大牛
  • 注册日期2001-12-30
  • 最后登录2007-08-02
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-13 21:26
是由系统自动分配物理地址的
------------------------------ [color=red]茶壶深爱着茶叶,表达爱意时却遭到拒绝,茶壶大吼:为什么?这一切都是为什么? 茶叶胆怯地说:俺妈说了,成天灌水的都不是好人。 ---别到处看,说你哪!!    [/color]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-06-14 09:15
你可以在驱动得到地。
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
地板#
发布于:2002-06-14 09:33
通过访问卡的PCI CONFIG SPACE 可以得到
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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,我现在还在研读。它对物理地址到虚拟地址的映射和上面的例子完全不同,大体上知道是通过读取设备的资源获得的,这些资源,应该在设备中有相应的信息。

以上很多问题,如果那位侠士能给出一个系统的解答,或者是,对这块有什么系统的理解,我自当感激涕零!!如果那里有什么文章,或者是书籍,也请给条明路!

谢谢指教!!


sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-14 10:48
谢谢以上各位的指教,我刚刚整理出问题来,就收到了这么多解答,万分感谢!
more
驱动中牛
驱动中牛
  • 注册日期2001-06-30
  • 最后登录2009-07-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-14 11:18
用端口基地址和物理地址,可以得到两种不同的访问设备的方式.
port IO &  memory map IO
sunnnn
驱动牛犊
驱动牛犊
  • 注册日期2002-01-30
  • 最后登录2009-03-20
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-14 11:32
请问Port Io是不是就是对映射以后的端口进行读写操作啊,
例如NdisRawRead....NdisRawWrite...HalRead....等等,而memory Io就是可操作内存一样,甚至可以用赋值等操作啊?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-06-14 11:52
对。
游客

返回顶部