`
ihuashao
  • 浏览: 4722896 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论
阅读更多

江西财经大学国贸学院 舒 剑
BIOS排错有否方法可循?有。但从哪学?不知道。自我从事BIOS研发以来,强烈的感觉就是,BIOS有如以前的中医,只能靠传帮带才能学的东西,而这还视乎做师傅的观念,看他愿否教于你。我也就想,或许过不了几天,他也会象中医一样,需要挽救。

内地的BIOS工程师,我一直以为,应该叫做BUG工程师。因为,BIOS一直是几家寡头公司在研发,而各厂商都是利用它的源码做一些修补。所以,我也只学到一些排错的方法,只能是一个BUG工程师。

在公司兼职已好几年了,每年都要做BIOS方面的培训,而且听众还不只是BIOS工程师,包括那些主板调测维修人员和逻辑设计工程师。这个机会促使我对平时的工作进行总结,并努力着眼于“为什么有故障,怎样解决”。

为此,始有此排错三法:

一、 排雷法

初做BIOS的人,首先遇到问题多是:BIOS停了,Debug Code是XX。象这种问题一般是一块主板刚做出来,接上CPU、内存条等必备设备,一开机,停了。或者,刚换了一个新的设备,如内存、显卡等等,开机,也停了,市场已经在卖的主板是不常见的。我将导致BIOS停滞的代码(段)称为“地雷”,踩到地雷了,自然无法往前走了。排雷法,就是设法找到地雷所在,排除它。这里“找”是关键。有人说了,不是有“Debug Code”,有什么好找的。说这话的,大多是我们的主管,他很纳闷,认为我们是在浪费时间。

要使用排雷法,有两件工具需要推荐。一是ROMTER+ROM卡,它的意义在于可以随时修改随时刷BIOS以看效果,一是有双端口监视的DEBUG卡,强调双端口是因为80Port已经被原厂BIOS用了,我们在排雷程中尽量使用另一端口。

现在要施法了,根据Debug Code的指引,我们能找到“丢”(这是AMIBIOS工程师常用的说法,我现在做AMIBIOS,自不能免)出该code的代码行位置,暂称之为A点,这个位置并不一定是“地雷”,但地雷一定在这个位置和下一个debug code丢出来的代码行之间。将下一个位置也找出来,称之为B点。怎么找?文件查找呀,什么FF之类,像VC都可以跨文件查找。AMIBIOS相对好些,在《BIOS研发技术》中公开了其流程,且该流程就是以debug code 为结点,虽说有点过时,但参考价值很大。有了A点和B点,这时大可以使用大学里学的《数据结构》中的“二分法”(谁说大学里学的没用来着?),在A点和B点代码之间均匀的间插一些(不要只局限于两处)你的代码。你的代码也不用做什么,只需要往DEBUG卡的另一端口丢一些你看得懂的数据——也是一种debug code就行。好了,重新编译,写入ROM卡,复位。什么?又停了。当然停了,你还没修改呢。没关系,你仔细看看你的代码所丢出的code,相应的代码行就是一个新的A点,同理也有一个新的B点,以此A、B点,重复前面的方法,如是几次,你就能找到造成BIOS停滞的地雷了。至于找到后如何排雷就没有通用的办法了,你要看此地雷形成的原因是什么,特殊情况特殊处理。
方法说起来很简单,但使用过程还是有几点要注意。

1、你的代码不能随意改变寄存器的值,以不影响原代码执行路径为原则。如果你的代码所在位置可以使用堆栈那就用堆栈保护你要用的寄存器,典型如下(以8位端口为例):
push ax
push dx
mov al, debug_code
mov dx, port_address
out dx, al
pop dx
pop ax
如果你的端口地址小于100h,那dx都可以不用了,直接” out 82h, al”。如果你的代码还不能使用堆栈,如在bootblock段,那就使用sp(堆栈指针),因为堆栈不能用,该寄存器大多数情况下也就“没有用”。如:
xchg dx, sp
mov dx, port_address
mov al, debug_code
out dx, al
xchg dx, sp
al寄存器在很多代码行间隙是可以被改变而不影响程序执行的。你只要看后随的代码是不是先对它赋值再使用就知道了。

2、BIOS代码是分层结构的,上一层总是不断调用下一层的子过程。在排雷的过程中间插代码时,一次也尽量在同一层,判定地雷不在此层后再继续到下一层使用排雷法。对于文件也可以遵循此规则,先判定是否在同一文件中,如果不是再到另一文件中继续。

3、在找到地雷后千万别忘了抽去你插的“桩”。这一点很多高手都不在意,认为那样对代码没有影响,就让它了。但后来人看到这套源码,会不知所云,就象一条原来平直的高速公路,变成波浪形。

二、比较法

一客户买了一块PCI SCSI控制卡,插在某公司的主板上则该卡所接硬盘上安装的某个windows 应用软件就不能正常运行,但该卡插在别的主板上就一切OK。做为一个公司的BUG工程师,只有认同此乃BUG并开始努力解之。

所谓比较法,就是两个具有可比性的系统,一个已知没有故障,一个已知有故障,通过种种现状、参数的比较,找到故障系统的原因,并排除之。记住,前提是具有可比性,比如使用相同芯片的两个主板。

使用比较法也需要推荐一个工具,此工具是AMI公司的ru.exe,它适用于dos/windows98,windows2000版叫做se.exe。虽然,Award公司也有类似功能的工具软件,但在比较法中,该软件的file->save(F2)功能特别受用。该功能可以将某个PCI设备配置空间、系统所有PCI设备配置空间、你正查看的某段I/O、MEM、SIO、CMOS等等的内容保存至一个文件中。同时,它的另一个功能file->compare (F8)又可以从一个文件中读取其内容与正在查看的内容进行比较,区别显示相同与不同的单元。

介绍完上面ru.exe的两个功能,比较法的具体使用也就相当明了了。就是,将你所怀疑可能会引起故障的一些寄存器、I/O、MEM值从好的系统读取并保存到文件上,拿到故障系统中进行比较,如果有不同,则修改故障系统的值为好系统中对应值。如此逐个比较修改,你很可能幸运的发现故障消失了。(据说概率有70%之高)这是说很可能,是因为不是每个故障都可以修改设备的静态配置就能解决的,有些还是其它原因。它的难点是难以找到一个可比较的BIOS。

也有同几点需要在使用比较法给予提醒的:

1、尽量让硬件平台完全相同。这样,可减少一些不必的干扰。因为,一旦硬件发现改变,自然一些寄存器需要设置不同的值的。

2、在修改故障系统的寄存器之前,务必熟读其datasheet,明白修改后可能造成的后果,不要烧了主板。

3、经验不同的BIOS工程师所需要比较的工作量不同,一些有经验的工程师很容易知道该比较那些寄存器。给新手提个醒,除了PCI设备配置空间,Super I/O寄存器外别忘了Power Manage I/O寄存器,GPIO控制寄存器等,SiS芯片组还有APC寄存器。

4、相同的硬件不一定所有寄存器设置相同,有一些寄存器不同的BIOS有不同的值是正常的,如PIRQ就可以因不同厂家的BIOS而不现,还有像Power Manage I/O、GPIO的基地址等。
多年经验发现,比较法特别适用于内存、PCI设备不兼容等故障。另外比较法还可以扩展到相同厂家不同版本芯片间进行比较。

三、陷井法

陷井——我想各位都不陌生,小的时候谁没用它逮过麻雀或捉过小鱼,就连大文豪鲁迅先生也用过了。陷井法,也就是在“猎物”的必经之路上做好手脚,或引诱或等待“猎物”中套。这里的“猎物”就是BUG——具体的说是引起BUG的代码段。

在一个新的BIOS刚刚走完它的全程时,最大的考验就是windows的安装过程,最常见的就是安装过程中猝死(蓝屏)或怠工(那种象陷入死循环的死机)。这种BUG由于BIOS已经顺利运行完毕,用前面的“排雷法”已经没有机会,用“比较法”又找不到合适的可比较的BIOS。这时,只好考虑动点心思布“陷井”了。

在具体布“陷井”之前,先谈谈“陷井”的制作。非常之简单,象前面讲的“排雷法”一样,间插一些往DEBUG卡第二端口上丢自定义的CODE的代码——我将这些代码称之为“陷井”。通过在各个可疑的代码路径上布一些“陷井”,配以相应的DEBUG卡,从而判断出最后一次对BIOS的调用是哪些代码(段),再进一步分析这些“最后值守的可疑分子”不难找出“真凶”。这里提醒一点,DEBUG卡最好是那种数码显示不受系统复位影响的那种,因为有些BUG的现象就是系统复位,如果数码显示也被系统复位给清掉了,就看不清最后一个CODE是什么了。

熟手已经想到,这种BUG应该属BIOS Runtime模块的BUG。但Runtime代码没有约定的执行流程,完全取决于应用层对其的调用。那我们的陷井布哪呢?其实,BIOS的Runtime代码主要集中:PCI/PnP、INT15、SMI、INT10和INT13。其中INT10和INT13分别是显示和磁盘的ISR,这些代码产生的BUG都比较直观,或者显示出错但系统可照常运行或者是磁盘I/O发生错误,而且这两个模块也容易使用各种测试软件测出。我们要布的陷井集中在PCI/PnP、INT15和SMI的处理代码中,windows安装过程产生的系统死机也常是深藏于上述代码中的BUG引起。对AMI BIOS(我只能以AMI BIOS为例,因为它的源码已经公开过,不会有版权之虞)这三功能的总入口点就分别在RT.ASM、INT15.ASM、SMI.ASM。不妨先在此三个总入口处布下陷井,看看“猎物”走的是哪一条道,而后再逐步分清它走的是哪一条子道,耐心点重复几次,不难发现其藏身之处。
陷井法的原理就是这样,使用过程中就看各人的手法了,几点还是提出来给大家参考:

1、 布陷井之前可以充分使用setup的设置功能关闭/打开一些设备,以排除一些不必布陷的代码,提高陷井的命中率。

2、 陷井法与前面的排雷法之本质区别在于陷井法首先是找路,就如在一个交通错综复杂的城市,先确定“猎物”是否经过某条代码路径,只是找到路径后才可以利用排雷法定位具体的代码段。

3、 windows安装过程中的BUG,可以借助ghost这个工具,将发生问题之前的系统备份下来,免去每次重新安装。

4、 如果你的DEBUG卡允许(不允许的时候可以使用BDA[Bios Data Area]中一些未定义的内存),你尽量将一些现场密切相关的寄存器值也丢出来,为下一次布陷井提供更多的参考,如一些中断状态值或子功能号等。

来源:ccw

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xtdumpling/archive/2008/03/28/2226787.aspx

分享到:
评论

相关推荐

    Linux启动排错实例

    对于新手来说,理解这个过程并学会排错是成为Linux系统管理员的基础。本文将深入探讨Linux启动排错实例,帮助你掌握这一核心技能。 首先,我们从Linux启动流程开始。在Linux系统中,启动流程通常分为BIOS自检、GRUB...

    华为服务器brick平台BIOS参数参考

    RAS特性相关任务部分介绍了与服务器的可靠性、可用性和可维护性(RAS)相关的一些高级功能,如CMCI(Chipset Management Controller Interface)功能的使能或关闭、内存热调节、内存排错、设备标记、PCIe高级错误报告...

    电脑系统排错.rar

    电脑无法正常启动可能是引导扇区损坏、系统文件丢失或BIOS设置错误。可以尝试使用系统恢复选项,如Windows的“安全模式”、“系统修复”或“命令提示符”。如果硬盘出现问题,可使用系统安装盘进行修复或更换硬盘后...

    Centos7系列(五)聚合链路与grub配置文件及排错1

    1. BIOS进行硬件自检。 2. 激活主引导记录(MBR),MBR不含文件系统,直接加载GRUB引导程序。 3. GRUB加载到内存形成微系统,具备简易文件系统功能。 4. 微系统找到并加载分区上的内核文件(如vmlinuz),接着处理...

    服务器维修故障诊断思路大全.docx

    服务器排错的基本原则包括:尽量恢复系统出厂配置、从简单到复杂逐步排除故障、检查硬件配置、资源配置、BIOS、F/W 和驱动程序、TPL 等。服务器工程师需要遵循这些原则来快速解决问题,减少故障停机时间。 四、...

    电脑硬件常见故障分析排除手册全集

    例如,对于一款Athlon XP 1600+ CPU,BIOS显示其工作频率为1050MHz,而实际的Athlon XP 1600+应该工作在133MHz倍频下,即1400MHz。但在BIOS设置中,倍频被错误地设置为129MHz。这种情况下,通过正确调整BIOS中的设置...

    服务器维修故障诊断思路大全.docx编程资料

    #### 三、服务器故障排错的基本原则 1. **恢复出厂配置** - **硬件配置**:移除所有非原装部件。 - **资源配置**:重置BIOS设置至默认状态。 - **软件配置**:更新至最新版本的BIOS、固件和驱动程序。 - **兼容...

    电脑主板故障检测及维修方法.pdf

    二、排错方法 1. 逐级排查:先检查输入输出信号,再查找控制信号,若无问题,继续向上级电路追溯。 2. 临时替换:怀疑某个IC损坏时,可以暂时用相同型号或程序内容相同的IC覆盖在原IC上,观察电脑运行状态。 3. 切线...

    惠普 HP ProLiant DL320e Gen8 v2 服务器用户手册

    本文档是一份关于惠普HP ProLiant DL320e Gen8 v2服务器的用户手册,该手册主要针对负责安装、管理和排错服务器和存储系统的人员。手册假定读者具备了在电脑设备服务中的合格资格,并且受过训练能够识别具有危险能量...

    服务器常规维修与判断方法.doc

    2. **服务器故障排错的基本原则** - 还原系统默认配置:去除非标准硬件,恢复BIOS、固件和驱动程序到最新版本。 - 从简单到复杂:先独立运行服务器,再接入网络;从最小系统逐步增加硬件;从基础操作系统开始逐步...

    Cent0S7启动配置和服务管理

    除了切换默认运行级别外,还可以临时改变运行级别或者隔离特定的运行级别,以便进行维护或者排错。例如,可以使用`systemctl isolate multi-user.target`来立即切换到多用户文本模式。这样可以在不更改默认运行级别...

    服务器常规维修与判断方法

    服务器故障排错的基本原则包括恢复系统到默认配置,即移除非标准硬件,清除CMOS设置,更新BIOS、固件和驱动程序,确保所有扩展的硬件在兼容列表中。此外,遵循从简单到复杂的逻辑,先独立运行服务器,再接入网络,从...

    服务器硬件维护.ppt

    首先,服务器故障排错的基本原则应遵循“从简单到复杂”的原则。这意味着在解决故障时,应先检查和处理最基础的问题,如系统个体、最小化的硬件配置和基本操作系统,然后逐步增加复杂性,直至找到问题所在。例如,当...

    HP服务器问题汇总HP服务器问题汇总.doc

    * 操作系统安装时的排错方法:在HP ProLiant服务器上安装操作系统时,可能会遇到一些问题,例如,无法启动、无法识别硬盘等。这类问题可以通过检查BIOS设置、硬盘连接、操作系统安装媒体等来排除。 * HP ProLiant ...

    Linux系统第5章系统启动过程分析

    Linux系统的启动过程是一个复杂而有序的系列步骤,它从计算机硬件自检开始,最终进入操作系统并让用户登录。...通过深入学习GRUB的配置和修复,以及init进程的功能,可以提升在系统排错中的效率和能力。

    HP服务器问题汇总.doc

    1. 检查服务器的 BIOS 设置,确保其正确地配置了启动顺序和引导设备。 2. 检查服务器的硬件配置,确保其满足操作系统的最低配置要求。 3. 尝试使用不同的安装媒体,例如光盘、USB 等。 4. 检查服务器的电源供应情况...

    IBM服务器性能.docx

    - **使用bmc_cfg工具**: 作为一种排错工具,bmc_cfg也可用于配置BMC的初始网络设置,如IP地址、子网掩码、默认网关等。但该工具仅存在于固件更新盘中,不可独立使用。 - **步骤**: 1. 完成BMC固件更新后,退出...

    嵌入式系统/ARM技术中的Linux系统死机的软硬件问题分析

    系统出现死机,一般分为两种情况:一是硬件问题;二是软件问题。  一、硬件问题  可以考虑分析以下几点: ...  虽然平时运行没有问题,但... 对于服务器,可以使用自带的监测工具进行测试,也是一个不错的排错方法。

    电脑故障维护集锦.RAR

    - BIOS设置:学习如何进入BIOS,调整相关设置以解决问题。 - 系统恢复:了解系统还原点、重装系统等方法,以应对严重软件故障。 - 硬件更换:当硬件损坏时,知道如何正确地更换故障部件,如更换硬盘、内存等。 5...

Global site tag (gtag.js) - Google Analytics