PCI ExpressのPIOリードの謎(2)
昨日の、PIOリードのアドレスがバラバラになる件ですが、PCI ExpressのBAR空間をMmMapIoSpaceで仮想アドレスを割り当てるときに、
PVOID MmMapIoSpace(
_In_ PHYSICAL_ADDRESS PhysicalAddress,
_In_ SIZE_T NumberOfBytes,
_In_ MEMORY_CACHING_TYPE CacheType
);
の第三引数MEMORY_CACHING_TYPE CacheTypeをどうするかで挙動が変わることがわかりました。
このタイプは、MmNonCachedか、MmCachedか、MmWriteCombinedなのですが、MmWriteCombinedにしておくとWriteは超高速になります。なお、MmWriteCombinedにしておくと書き込みアドレスの順序がバラバラになるのは仕方がないことです。
MSDNのドキュメントによればキャッシュに関してはMmWriteCombinedもMmNonCachedもキャッシュされないとあるので同じだと思うのですが、読み出したときの挙動は、
- MmNonCached → 読み出しアドレスは順番
- MmCached → 読み出しアドレスは順番
- MmWriteCombined → 読み出しアドレスはバラバラ 2DWリードも発行される
でした。
MmNonCachedでアドレスが順番になるのはいいのですが、2DWリードが発行されないので、速度は遅くなります。あまりメリットはありません。
| 固定リンク


コメント