zhangsn98
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2007-09-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3709回复:8

哪位大大讲讲bios是如何把 pci卡上的内存映射到主内存上的

楼主#
更多 发布于:2007-05-23 11:05
哪位大大讲讲bios是如何把 pci卡上的内存映射到主内存上的
bini
驱动牛犊
驱动牛犊
  • 注册日期2002-05-12
  • 最后登录2009-05-13
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-25 15:42
看PCI Spec哦. 先把每个BAR写0xFFFFFFFF,读回来它的解码宽度,然后按PCI和PCI桥资源分配的算法,加上一个平台的内存分配情况,算出来这个BAR填什么基地址.
http://www.ufoit.com 计匠网
mrchenlei
驱动牛犊
驱动牛犊
  • 注册日期2007-05-28
  • 最后登录2012-06-12
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望114点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-23 09:24
对多个PCI设备,还要统一分配内存资源,避免相互冲突。
chunbee
驱动牛犊
驱动牛犊
  • 注册日期2004-09-01
  • 最后登录2009-12-22
  • 粉丝0
  • 关注0
  • 积分130分
  • 威望13点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
地板#
发布于: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开始)


差不多了
原来BIOS就那么几行代码啊
oceanic
驱动牛犊
驱动牛犊
  • 注册日期2007-06-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-12-12 17:35
"然后程序员写一个32比特的起始地址到该寄存器,将ROM起始地址指定到一个大小为128KB的地址边界上。命令寄存器中的存储空间比特要优先于扩展ROM允许比特。"
 ——写一个起始地址到该寄存器是怎么回事儿?难道Oprom的大小和基址不是在设备初始化的时候就确定的么?


"仅当存储器空间比特(在它的命令寄存器中)和扩展ROM允许比特(在它的扩展ROM基址寄存器中)同时设定为1时,该功能的扩展ROM才应对存储器访问做出响应。"
——该功能的扩展ROM才应对存储器访问做出响应的意思是,扩展ROM中的bootrom程序才能被自动引导?
buaawr
驱动牛犊
驱动牛犊
  • 注册日期2004-05-11
  • 最后登录2008-10-16
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望30点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-03 10:06
通俗的讲,pci spec为PCI 卡预先定义了基址寄存器(Rx10h~Rx27h),bios通过填写这个寄存器来告诉PCI卡我们为他分配了哪一段内存地址(注意是内存地址而不是内存数据)给他使用。当上层软件提出访问这个地址段的数据时,芯片组会自动将这条指令打到PCI总线上而不是内存颗粒,这样PCI卡就会知道是要访问他肚子里面的MMIO寄存器,就会响应并把数据突出给芯片组-》CPU。

由此,就给大家造成PCI卡占用了内存资源的假相,其实不是那么回事,只是PCI卡占用了一些内存地址空间而已。毕竟内存条上的内存一般不可能使用到4G的内存地址。
bobo0001
驱动牛犊
驱动牛犊
  • 注册日期2008-04-15
  • 最后登录2008-10-13
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-04-15 14:14
路漫漫
没有什么可以难倒中国人。
billasx
驱动牛犊
驱动牛犊
  • 注册日期2006-01-23
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-05-06 01:18
受益匪浅
hunbalo
驱动牛犊
驱动牛犊
  • 注册日期2004-04-21
  • 最后登录2020-10-20
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望124点
  • 贡献值0点
  • 好评度85点
  • 原创分1分
  • 专家分0分
  • 社区居民
8楼#
发布于:2008-07-18 23:10
参见linux pci部分代码。
游客

返回顶部