DXR165の備忘録

自分用の備忘録です。

Intel CPU の Host Bridge/DRAM Registers 内にある PCIEXBAR 調査メモ  

7th Gen Intel Processor の Host Bridge/DRAM Registers 内にあるPCIEXBAR ( PCI Express Register Range Base Address ) を下記の環境で実際に調べてみました。

目的
Intel x86 プラットフォームではCPU/チップセットがアドレス・デコード機能を実装することによりPCIeコンフィグレーションレジスタをメインメモリにマッピングしている。PCIEXBARがわかれば、PCIeコンフィグレーションレジスタがメインメモリにマップされているアドレスがわかり、そのレジスタのすべてにアクセスが可能となる。今回はそれを実際のマシンで確認する。


調査環境
■CPU Kaby Lake-S  Intel Pentium G4560 3.50 GHz
■マザーボード ASUS PRIME H270-PLUS
■メモリー DDR4-2133 4G x 2 Dual-Channel Mode
■SSD システムドライブ:Samsung NVMe SSD 960 EVO 250GB
■OS Microsoft Windows 10 Home 64bit Ver.1709
■Chipset H270 Stepping A0
■Intel Chipset Driver Ver. 10.1.1.44
■BIOS AMI BIOS Ver. 0808 UEFI Comp Ver 2.60
■Onboard PCI Devices  なし


調査方法
プリブート環境にてUEFI Interactive Shell for x64 v2.2 by EDK 2 のpci -i コマンドと dmemコマンドを実行し調査する。

調査手順
1. Pentium G4560はPCIeルートコンプレックスをCPUに内臓している。CPUの仕様書でHost Bridgeのバス、デバイス、機能の各番号を調べる。それによるとB0:D0:F0となっている。pci -i コマンドでpci -i コマンドのPCIコンフィグレーションレジスタのダンプを取る。仕様書によるとPCIEXBARレジスタは60h番地の64ビット幅。PCIEXBARは38:28ビット範囲にあり、最大39ビットのアドレスが指定できる。

pci -i コマンドのpci -i コマンド実行結果(x86はリトルエンディアン)
  PCI Segment 00 Bus 00 Device 00 Func 00 [EFI 0000000000]
  00000000: 86 80 0F 59 06 00 90 20-05 00 00 06 00 00 00 00  *...Y... ........*
  00000010: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000020: 00 00 00 00 00 00 00 00-00 00 00 00 43 10 94 86  *............C...*
  00000030: 00 00 00 00 E0 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000040: 01 90 D1 FE 00 00 00 00-01 00 D1 FE 00 00 00 00  *................*
  00000050: C1 02 00 00 31 00 00 00-47 00 B0 C4 01 00 00 C0  *....1...G.......*
  00000060: 05 00 00 F8 00 00 00 00-01 80 D1 FE 00 00 00 00  *................*
  00000070: 00 00 00 FF 01 00 00 00-00 0C 00 FF 7F 00 00 00  *................*
  00000080: 10 00 00 00 00 11 11 00-1A 00 00 00 00 00 00 00  *................*
  00000090: 01 00 00 FF 01 00 00 00-01 00 30 3A 02 00 00 00  *..........0:....*
  000000A0: 01 00 00 00 02 00 00 00-01 00 40 3A 02 00 00 00  *..........@:....*
  000000B0: 01 00 C0 C0 01 00 40 C0-01 00 00 C0 01 00 C0 C4  *......@.........*
  000000C0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000D0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000E0: 09 00 10 01 51 20 01 62-C8 00 04 94 00 00 04 00  *....Q .b........*
  000000F0: 00 00 00 00 C8 0F 09 00-00 00 00 00 00 00 00 00  *................*

上記の結果から、この環境ではPCIEXBARは0_F800_0000hから始まり64MBの範囲であると判明した。バス番号は0-63まで。

2. メインメモリのアドレス0_F800_0000hからHost Bridge (B0:D0:F0)のレジスタ長に当たる4KBのダンプをdmemコマンドでとり、ベンダIDとデバイスIDがそれぞれ8086h 、590Fhとなるかを確認する。

各コンフィグレーションレジスタの区割りは4KBアライメントになり下の計算式で割り出す。
PCI Express Base Address + Bus Number * 1MB + Device Number * 32KB + Function
Number * 4KB
注意)各ナンバーは10進表現


Host Bridge dmemコマンドの実行結果(x86はリトルエンディアン)

Memory Address 00000000F8000000 1000 Bytes
  F8000000: 86 80 0F 59 06 00 90 20-05 00 00 06 00 00 00 00  *...Y... ........*
  F8000010: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  F8000020: 00 00 00 00 00 00 00 00-00 00 00 00 43 10 94 86  *............C...*
  F8000030: 00 00 00 00 E0 00 00 00-00 00 00 00 00 00 00 00  *................*
  F8000040: 01 90 D1 FE 00 00 00 00-01 00 D1 FE 00 00 00 00  *................*
  F8000050: C1 02 00 00 31 00 00 00-47 00 B0 C4 01 00 00 C0  *....1...G.......*
  F8000060: 05 00 00 F8 00 00 00 00-01 80 D1 FE 00 00 00 00  *................*
  F8000070: 00 00 00 FF 01 00 00 00-00 0C 00 FF 7F 00 00 00  *................*
  F8000080: 10 00 00 00 00 11 11 00-1A 00 00 00 00 00 00 00  *................*
  F8000090: 01 00 00 FF 01 00 00 00-01 00 30 3A 02 00 00 00  *..........0:....*
  F80000A0: 01 00 00 00 02 00 00 00-01 00 40 3A 02 00 00 00  *..........@:....*
  F80000B0: 01 00 C0 C0 01 00 40 C0-01 00 00 C0 01 00 C0 C4  *......@.........*
  F80000C0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  F80000D0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  F80000E0: 09 00 10 01 51 20 01 62-C8 00 04 94 00 00 04 00  *....Q .b........*
  F80000F0: 00 00 00 00 C8 0F 09 00-00 00 00 00 00 00 00 00  *................*
  F8000100: FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF  *................*

     |
  F8000FF0: FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF  *................*

   は後述するTOLUDレジスタ(32bit)でTOLUDは0_C4C0_0000hとなる。




次にUSB 3.0 xHCI Controller (B0:D20:F0) のコンフィグレーションレジスタも見てみる。


オフセットは32×20 (KB) = 640 × 1024 = A0000h になる。

xHCI Controller dmemコマンドの実行結果(x86はリトルエンディアン)
Memory Address 00000000F80A0000 1000 Bytes
  F80A0000: 86 80 AF A2 06 00 90 02-00 30 03 0C 00 00 80 00  *.........0......*
  F80A0010: 04 00 21 F7 00 00 00 00-00 00 00 00 00 00 00 00  *..!.............*
  F80A0020: 00 00 00 00 00 00 00 00-00 00 00 00 43 10 94 86  *............C...*
  F80A0030: 00 00 00 00 70 00 00 00-00 00 00 00 FF 01 00 00  *....p...........*
  F80A0040: FD 01 34 80 88 C6 0F 80-00 00 00 00 00 00 00 00  *..4.............*
  F80A0050: 5B 6E CE 0F 00 00 00 00-00 00 00 00 00 00 00 00  *[n..............*
  F80A0060: 30 60 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *0`..............*
  F80A0070: 01 80 C2 C1 08 00 00 00-00 00 00 00 00 00 00 00  *................*
  F80A0080: 05 00 86 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  以下省略

しかし、DRAMの価格が安くなったとはいえ、メインメモリのうち、この64MBが無駄になるとは少し悲しい気分ですぅ。
訂正
最近(2017年時点)のIntel CPU(MCH)はMemory Reclaim機能があるのを忘れていました。この機能を有効な場合、TOLUDから4Gまのメモリ範囲は4Gよりも上にリマップされメインメモリとして利用することが可能になります。したがって、上記の実例ではPCIeコンフィグレーションレジスタのマップ範囲はTOLUDより上にあるため、メモリホールとなりません。お詫びして訂正します。

Memory Reclaim機能については下記記事も参考にして下さい。
ASUS マザーボード BIOS設定項目のメモ 


関連記事

category: PC-HW

tb: 0   cm: 0

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://dxr165.blog.fc2.com/tb.php/407-e0ff1005
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

最新コメント

カウンター(2012/3/10以降)