有人能告诉我如何增加条大小吗(比如使用setpci或其他方式(?
我可以读取BAR寄存器,也可以确定它的大小。但如果我想扩大或缩小BAR大小怎么办?例如:BAR 4是可预取的;1M";。如果我想将其扩展到1600万呢?
我可以成功地使用驱动程序,但如果我想在没有驱动程序帮助的情况下完成它呢(比如使用setpci,因为我们可以编辑BAR寄存器值(。
PCI设备的地址空间在引导的早期就被分配(在PC上,通常在加载操作系统之前就在BIOS中完成(。有些设备确实允许更改BAR大小,但更改方式将非常特定于设备。很可能,您需要对设备进行物理操作(设置跳线(,或写入设备上的一些非易失性存储器(NVRAM或其他(,因为该设置需要在重置或电源循环后才能运行。
如果你的设备真的支持更改BAR大小,数据表应该解释如何配置它。正如@prl所说,对于大多数设备来说,它是无法更改的。
从主机端来看,PCI根复合体在设备枚举期间使用一个协议来发现设备"占用"的空间有多大;想要";然后告诉设备它被分配了什么地址范围(因此应该响应(。但如上所述,这通常在启动时很早就完成了,因为这需要协调:你可以很容易地写入设备配置寄存器,告诉它有更多的地址空间,但内存控制器和根复合体也需要知道这一点,否则实际的内存引用永远无法到达设备(系统也可能出现故障(。你不能随意扩展地址窗口,因为可能有其他设备已经在你的设备上方和下方分配了内存。
对于大多数设备,BAR大小是设备的物理属性,不能更改。
该设备实现了固定数量的MMIO或内存,因此使BAR大于此没有任何意义。