PCI BAR空间分为两类:IORESOURCE_IO(非可预取)和IORESOURCE_MEM(可预取),一般来说,对于BAR为寄存器空间,都要设置为IORESOURCE_IO;对于BAR为存储器空间,要设置为IORESOURCE_MEM;
那么为什么要区分两种类型的空间呢?
所谓预取,重点在“取”字,这要从读取IO寄存器和RAM内存的区别来看。
LDD3
如果这个内存区被标识为可预取的, CPU 可缓存它的内容并且对它做所有类型的优化. 非可预取的内存存取, 另一方面, 不能被优化因为每次存取可能有边际效果, 就象 I/O 端口. 映射它们的寄存器到一个内存地址范围的外设声明这个范围是非可预取的, 而象在 PCI 板的视频内存的一些是可预取的.
WEB SEARCH
在一些应用中我们会遇到"可预取"内存的概念,可预取性是指存储器空间的可预取能力。如果读操作没有副作用(即如同从 RAM 中读数据一样不会破坏数据),则称存储器空间可预取。必要时可将字节写操作合并成一个双字写操作。可预取是读取一次以后不会改变读取地址和存储状态的任何改变,CPU 可缓存它的内容并且对它做所有类型的优化,.非"可预取"的内存就象FIFO地址影射到内存地址,读取数据以后会引起FIFO指针的改变.另外还象一些中断状态IO影射到内存,读取这个内存后,可能会清除中断标志等等,所以CPU不可缓存这个内存地址.