阅读:3844回复:8
哪位大大讲讲bios是如何把 pci卡上的内存映射到主内存上的
哪位大大讲讲bios是如何把 pci卡上的内存映射到主内存上的
|
|
沙发#
发布于:2007-05-25 15:42
看PCI Spec哦. 先把每个BAR写0xFFFFFFFF,读回来它的解码宽度,然后按PCI和PCI桥资源分配的算法,加上一个平台的内存分配情况,算出来这个BAR填什么基地址.
|
|
|
板凳#
发布于:2007-06-23 09:24
对多个PCI设备,还要统一分配内存资源,避免相互冲突。
|
|
地板#
发布于:2007-11-07 22:42
这个问题主要涉及到一个寄存器:扩展Rom基址寄存器
如果功能卡中需要嵌入扩展Rom(Oprom),该PCI寄存器必须实现。许多PCI功能都嵌入了设备ROM,它包含了该功能的设备驱动程序。扩展Rom的起始存储器地址及其大小均在扩展Rom基址寄存器中定义,而扩展Rom基址寄存器位于配置头区域的双字12中。系统一加电,就必须立即自动配置系统,以便每个功能的IO和存储器解码器能识别出相互排斥的地址范围。因此,配置软件必须能检测到一个扩展Rom需要多大的存储空间。除此之外,为了在不冲突的地址范围中确立其ROM的位置,系统必须能够编程控制Rom的地址解码器。 当启动配置程序检测到某功能已经实现了扩展Rom基址寄存器时(通常向它写全“1”并回读),必须立即检查ROM的前两个位置,核对其扩展Rom的签名(0x55AA),确定其是否真的安装了ROM(也就是说,ROM插座可能是空的)。如果安装了,配置程序必须映射(Shadow)Rom,并执行其初始化代码。 扩展Rom基址寄存器的格式: 比特0为1,表示启用该功能的ROM地址解码器(假设命令寄存器中的存储空间比特也设定为1)。 比特[10:1]保留。 比特[31:11]用于指定ROM的起始地址(这个地址是根据ROM的大小来分割的)。 例如,假设程序员写0xFFFFFFFE到扩展Rom基址寄存器(即清除0比特-扩展ROM允许,防止在分配起始存储地之前启用ROM地址解码器),随后读取该寄存器,结果值若为0xFFFE0000,则说明了以下问题: 比特0的值为0,这说明ROM地址解码器当前已禁用。 比特[10:1]保留。 在基址寄存器字段(即比特[31:11])中,比特17是程序员可将其设为1的最低有效比特。该比特的二进制权值为128K,这说明ROM解码器需要将128K的存储空间分配给ROM。然后程序员写一个32比特的起始地址到该寄存器,将ROM起始地址指定到一个大小为128KB的地址边界上。 命令寄存器中的存储空间比特要优先于扩展ROM允许比特。仅当存储器空间比特(在它的命令寄存器中)和扩展ROM允许比特(在它的扩展ROM基址寄存器中)同时设定为1时,该功能的扩展ROM才应对存储器访问做出响应。 检测到有ROM后,BIOS负责把ROM拷贝到0xc0000到0xdffff的存储器中(VGA的ROM必须从0xc0000开始) 差不多了 |
|
|
地下室#
发布于:2007-12-12 17:35
"然后程序员写一个32比特的起始地址到该寄存器,将ROM起始地址指定到一个大小为128KB的地址边界上。命令寄存器中的存储空间比特要优先于扩展ROM允许比特。"
——写一个起始地址到该寄存器是怎么回事儿?难道Oprom的大小和基址不是在设备初始化的时候就确定的么? "仅当存储器空间比特(在它的命令寄存器中)和扩展ROM允许比特(在它的扩展ROM基址寄存器中)同时设定为1时,该功能的扩展ROM才应对存储器访问做出响应。" ——该功能的扩展ROM才应对存储器访问做出响应的意思是,扩展ROM中的bootrom程序才能被自动引导? |
|
5楼#
发布于:2008-04-03 10:06
通俗的讲,pci spec为PCI 卡预先定义了基址寄存器(Rx10h~Rx27h),bios通过填写这个寄存器来告诉PCI卡我们为他分配了哪一段内存地址(注意是内存地址而不是内存数据)给他使用。当上层软件提出访问这个地址段的数据时,芯片组会自动将这条指令打到PCI总线上而不是内存颗粒,这样PCI卡就会知道是要访问他肚子里面的MMIO寄存器,就会响应并把数据突出给芯片组-》CPU。
由此,就给大家造成PCI卡占用了内存资源的假相,其实不是那么回事,只是PCI卡占用了一些内存地址空间而已。毕竟内存条上的内存一般不可能使用到4G的内存地址。 |
|
6楼#
发布于:2008-04-15 14:14
路漫漫
|
|
|
7楼#
发布于:2008-05-06 01:18
受益匪浅
|
|
8楼#
发布于:2008-07-18 23:10
参见linux pci部分代码。
|
|