0

P2P BRIDGE の場合、pciConfigTopoShow() の出力の「mem」と「preMem」は何ですか?

これが私のターゲットの出力です...

[1,0,0] type=P2P BRIDGE to [2,0,0] base/limit: mem= 0xa0000000/0x9ffffffff preMem=0x0000000080000000/0x00000000800ffffff I/O= 0xe8000000/0xe7ffffff status=0x0010 ( CAP command=0) =0x0007 ( IO_ENABLE MEM_ENABLE MASTER_ENABLE ) [2,1,0] type=P2P BRIDGE to [3,0,0] base/limit: mem= 0xa0000000/0x9fffffff preMem=0x0000000080000000/0x00000000800fffff I/O= 0xe870ff0status=0ffx0000 ( CAP DEVSEL=0 ) command=0x0007 ( IO_ENABLE MEM_ENABLE MASTER_ENABLE ) [3,0,0] type=P2P BRIDGE to [4,0,0] base/limit:mem= 0xa0000000/0x9fffffff preMem=0x80100000/0x800ffffff I/O= 0x0000/0xffff status=0x0010 ( CAP DEVSEL=0 ) command=0x0007 ( IO_ENABLE MEM_ENABLE MASTER_ENABLE ) プリフェッチ可能な 64 ビット メモリ空間 @ 0x0000 の bar0

4

1 に答える 1

0

「mem」と「preMem」の値は、関数呼び出しのいくつかのレイヤーによってpciConfigTopoShow()関数から生成されます。「mem」は、「/」で区切られたメモリベースとメモリ制限をそれぞれ示すブリッジにマップされる通常のメモリウィンドウ用です。

「preMem」は、デバイスがサポートしている場合、プリフェッチ可能なメモリウィンドウ用であり、このデバイスのメモリベースとメモリ制限を示します。64ビットマシンの場合、これらの値は64ビット量として表示されます。

最終的に、ファイルWIND_BASE / target / src / drv / pci / pciConfigShow.cにあるpciConfigForeachShow()関数は、次のコードスニペットで質問とともに示される出力を生成します。

if ( cmdReg & PCI_CMD_MEM_ENABLE )

{

     pciConfigInWord(bus,device,function,

                     PCI_CFG_MEM_BASE, &memBase);

     pciConfigInWord(bus,device,function,

                     PCI_CFG_MEM_LIMIT, &memLimit);

     printf("\tbase/limit:\n");

     printf("\t  mem=   0x%04x0000/0x%04xffff\n",

                 memBase & 0xfff0, memLimit | 0x000f);



     pciConfigInWord(bus,device,function,

                     PCI_CFG_PRE_MEM_BASE, &memBase);

     pciConfigInWord(bus,device,function,

                     PCI_CFG_PRE_MEM_LIMIT, &memLimit);

     if ( ( memBase & 0x000f ) == 0x0001 )

     {

         /* 64-bit memory */

         pciConfigInLong(bus,device,function,

                         PCI_CFG_PRE_MEM_BASE_U,

                         &memBaseU);

         pciConfigInLong(bus,device,function,

                         PCI_CFG_PRE_MEM_LIMIT_U,

                         &memLimitU);

         printf("\t  preMem=0x%08x%04x0000/"

                     "0x%08x%04xffff\n",

                      memBaseU, memBase & 0xfff0,

                      memLimitU, memLimit | 0x000f);

     }

     else

         printf("\t  preMem=0x%04x0000/0x%04xffff\n",

                     memBase & 0xfff0, memLimit | 0x000f);

     }
于 2012-09-11T13:56:44.563 に答える