为了使pci 设备有更强的功能,更方便的使用方法,pci 可以在在址空间去重定向pci devices.
在system 开机的时候,与具体设备无关的软件必须去检测到这是一个什么设备,构建一个一致(consistent)
的地址映射,还要检测这个设备有没有扩展rom. 下面的章节将会包括这些内容。
1. Address Maps
Power-up 软件(应该就是bios) 将系统引导到操作系统之前需要建立一个一致(consistent) 的地址映射,这就是说它需要确定
这个系统有多少内存,I/O 控制器需要多少空间。当这些信息确定好之后,power-up 软件(bios) 可以将I/O 映射到一个合理的位置,
然后去处理系统启动。为了让这种映射做到设备无关,给这种映射的基地址放在事先定义好的head portion(配置空间的)。
所有Base Address register 的bit 0 是只读的,用来标识是映射到I/0 还是内存空间,如果是映射到内存空间,那么bit 0必须返
回一个0. 如果是映射到I/O 空间,那么bit 0必须返回一个1. 参考下面图形。
当bit 0 置1的时候,映射到I/O 空间的,始终是32bit 宽度, bit 1 是reserved. 当对bit 1作读操作的时候,必须返回0.
其他bit 就用来将这个设备映射到i/o 空间。
当bit 0 置0的时候,映射到内存可以32bit宽度也可以是64bit 宽度. 对于内存基地址寄存器,bit 2 和bit 1 应该按下表
去解析
bit 3应该设为1,如果里面的数据可预存取(prefetchable). 如果不是,应该设为0.
剩下的高位,具体为几,取决于这个设备需要多少地址空间。对于32bit 宽度的寄存器,可以做到从16字节到2GB.
如果一个设备需要1M的空间,那么它就去把高位的12bit设为1,其他位置0.
power-up 软件可以通过往里面写一个全1的值,然后读回来,就可以确定他需要多大的地址空间。对于无关紧要的
bit 都会返回0.不做用的(unimplemented) base address 写为0.
这种设计意味着用作地址的都是2的指数,以及被很自然的排列整齐了,