阅读:4769回复:9
有关OptionROM,BBS等(changjt请进)
在下最近在研究Option ROM和BBS方面的知识,有些心得,但更多的是迷茫和疑问,特此新开一帖,向大家咨询,还请大家不吝赐教。
特别感谢changjt。 |
|
沙发#
发布于:2004-01-31 09:36
以下是changjt的发言,转贴:
关于作OptionROM的话题我也很感兴趣,在不改变主板BIOS的前提下通过OptROM来扩展BIOS功能实不失为一个好方法. 我计划想做一种BIOS调试卡,现在已初具雏形,可以在POST过程中截停,然后就可以查看当前寄存器和内存中的数据以及建立起来的中断向量,比如很多BIOS执行过程中的遗迹在POST结束后都会被清除,而使用这种方法就可以看到了,目前功能还很简陋,后续会增加驻留,这样就可以跟踪其他ROM的执行过程了. 但现在有一个很大的问题,就是如何来控制各个OptionROM的加载顺序,我的ROM程序需要捕获初始化向量,而BBS里只规定了启动设备的启动顺序可调,并没有说各个外插卡的初始化顺序是怎样的.比如说,外插一块NIC卡和一块SCSI卡,在不同的机器上它们的初始化顺序可能是不同的,虽然启动顺序可以在setup里设的一样,这样我如何能保证我的ROM卡被BIOS最先初始化呢? 谁知道的能给讲讲BIOS是如何仲裁各个OptionROM的初始化顺序的吗?在AMIBIOS里好像叫DIM吧,设备初始化管理. |
|
板凳#
发布于:2004-01-31 16:13
有个问题,想请教大家。
有的pci设备的PCI ROM,没有按照bbs协议做BEV或BCV,而是Trap系统中断19H。对于这样的PCI ROM,设计思路是怎么样的? 我个人的理解: bios在load os前,对pci设备进行扫描,当发现某个pci设备有option rom时,解压该pci设备的option rom,执行该rom。该rom在此时保存int19h vector,并改变INT19H的中断向量指向自己rom中的某个位置。当bios调用int19h load os时,首先执行的就是改变后的int19h,也就是执行rom中的指令,完成某些操作。完成后在将原int19h的中断向量还原,bios调用int19h完成load os的动作。 不知道我的理解是否正确,还请有这方面经验的网友指教。 另外,还有的rom是trap int18h,希望有人能讲讲这方面的情况。 |
|
地板#
发布于:2004-02-02 19:38
赞同DavidWang_jimei的说法,我现在最关心的就是bios在load os前,对pci设备进行扫描的顺序是怎样的,如何来调整这个顺序?因为BBS并没涉及这部分的内容,但这个顺序却会影响到默认IPL table的排列顺序,虽然这个表可以通过BBS来作调整,但这种调整并不能影响BIOS扫描PCI设备的顺序,如何才能在源头上去控制IPL table的顺序呢?
在一台插有网卡、SCSI卡、RAID卡的机器上,BIOS是按照BUS:DEV:FUN的顺序来扫描各个PCI ROM的或者还是按照PCI ROM映射内存空间的遍历顺序来扫描PCI ROM的呢?我做了不少试验来分析,现在有些眉目了,但还不够确认,尤其是用在多PCI段的情形里,再加上一些板载设备的影响,反正我是被折腾了很久了。 |
|
地下室#
发布于:2004-02-02 21:53
关于Option ROM和BBS方面,以下是我的一些理解,不一定能回答你的问题,大家讨论讨论,权当抛砖引玉。
BIOS是如何与外插PCI卡的扩展ROM相交互的? 上电伊始,PCI卡即从串行eeprom中自动加载相关配置参数,在POST过程中,BIOS会枚举PCI总线,分配相应的BUS Number,这个过程对于AMI与Phoenix(Award)的BIOS的分配顺序是不同的,一个从前向后,另一个从后向前,因此两种BIOS里同一PCI总线分配的BUS Number是不同的;然后开始遍历总线分配各个PCI接口的DEV和FUN Number,构建系统资源图,如果存在PCI Expansion ROM,则将其映射进4G内存空间的高端,然后拷贝(映射?)进1M内存下的临时区域里(对于打包在主板BIOS里的Option ROM模块则可直接解压到1M内存下的临时区域里),接着再将该Option ROM拷贝到C000段(个人感觉做这一步是为了与XT/AT保持兼容吧),这时BIOS才通过一个INIT调用第一次把控制权交给该Option ROM的初始化向量,这时就雷同于NT下的Driver初始化过程了,遵从DDIM模型,经过必要的初始化,将BEV向量放置到IPL表中或者通过BCV将检到的硬盘挂接Int13,最后仅保留必要的服务例程驻留C000段已供调用并加以Shadow保护,将控制权返回给BIOS,以进行下一个PCI Expansion ROM的初始化。我做的BIOS调试卡就是在这里截停系统的。待所有PCI ROM都初始化完毕以后,BIOS清除掉所有临时内存区域里的痕迹,准备开始BOOTSTRAP的工作,这是通过一个Int19调用实现的。 以前的Int19所支持的启动设备和顺序都是固化在程式里的,现在支持BBS协议的Int19代码作了改进,可以灵活的从IPL Table里按照设定的顺序尝试一个接一个启动,具体实现就象DavidWang_jimei讲的那样用Trap向量的方法,属于编程机巧的范畴了。 对于直接去Trap系统中断Int19或Int18,是过去一些不支持BBS协议的Legacy卡为获取系统控制权而采用的方式,BBS不建议这样做,因为直接攫取系统启动/恢复向量的执行会冒很大的风险,一旦无法正确还原原有向量,将直接导致Boot失败.现在的PCI ROM里采用这样设计的我发现有些RAID卡在用,比如进入RAID界面的快捷键在POST过程中被按下以后,将会导致RAID设置程序代替原Int19例程,这样POST完以后将会直接进入RAID设置程式,而不是OS Boot了,所以当退出设置程式时接续的操作常常是重新启动而非继续引导了.而这样做的一个弊病就是当在SETUP里Disable掉Int19 Capture功能以后,这种RAID卡就无法正常使用了. [编辑 - 2/2/04 by changjt] |
|
5楼#
发布于:2004-02-02 22:48
以前在网上看到有人贴过Int19例程的代码解析分析,可惜比较老了
在日常工作中经常会碰到一些由于外插第三方SCSI/RAID卡的扩展ROM修改系统Int13中断以后导致的启动问题,需要一步步地去Debug系统中断19H例程,可恨不同版本BIOS的Int19代码还不一样,每次都要从头一步步看,直头疼。不过对于学习还是有帮助的 |
|
6楼#
发布于:2004-02-03 09:05
赞同DavidWang_jimei的说法,我现在最关心的就是bios在load os前,对pci设备进行扫描的顺序是怎样的,如何来调整这个顺序?因为BBS并没涉及这部分的内容,但这个顺序却会影响到默认IPL table的排列顺序,虽然这个表可以通过BBS来作调整,但这种调整并不能影响BIOS扫描PCI设备的顺序,如何才能在源头上去控制IPL table的顺序呢? 对pci设备的scan顺序是可以通过修改bios源代码来调整的,即可以从bus0到busFF,又可以反过来。 bios的pci scan顺序不会影响BBS中的IPL Table的顺序。IPL Table的顺序也跟BIOS所支持的BBS的模式有关. BIOS是按照bus:dev:func的顺序来扫描pci rom的。 |
|
7楼#
发布于:2004-02-03 09:18
To David:
我回MAIL给你了收到了吗? |
|
8楼#
发布于:2004-02-03 13:05
收到了,我给你回复了。
去看看吧。:) |
|
9楼#
发布于:2004-02-13 17:50
坚持近两周的BBS学习,在同事和经理的帮助下,已接近尾声.
|
|