个人电脑BIOS简介(2010)

2020-10-30 18:37:54

版权所有©2007,2011,2012作者:Daniel B. 塞多利笔记 未经作者许可,不得以任何形式转载!注意:本页面仍在建设中;如果一个主题不能 如欲了解更多信息,请与我们联系。

要做的是:我们重新计划提供不同BIOS功能的示例 以显示自设计第一台PC以来代码已变得多么复杂;另一个页面将突出显示 Bochs BIOS汇编级的一些例程,以及使用各种工具查看内容的指南 在一些相当新的主板的压缩BIOS代码中。

需要一群有成就的作家全职工作才能写出一本关于完整历史的教科书。 在合理的时间内完成PC BIOS的升级。我们甚至需要更长的时间才能对PC BIOS如何进行简要总结 多年来,代码发生了变化。虽然我们已经提供了许多关于特殊主题的详细信息(例如校验和、字节和甚至 一些装配清单),我们可以进行的研究和对不同类型的计算机的访问都是有限的。 尽管如此,我们希望提供一些您在其他地方可能找不到的有关此主题的数据;我们感谢您的反馈。

尽管许多细节(以及它们的顺序)多年来都发生了变化,但下面列出的是基本的 BIOS(基本输入/输出系统)代码必须在以下时间之前完成的操作 将控制权移交给操作系统。由于现代BIOS的复杂性,现在经常要完成这些项目 称为POST(开机自检),因为BIOS还包含代码 对于相当长一段时间内的许多其他任务和功能:

从上面的部分列表中可以看出,计算机的BIOS与其硬件有着千丝万缕的联系。 因此,BIOS代码的历史记录还必须至少包括PC硬件更改的历史摘要。在此之前 配备新处理器、其他内部设备(如实时时钟)、不同类型存储器等的计算机 在向公众开放之前,它们总是需要更改BIOS代码。注意专业是很重要的。 英特尔®处理器家族(见下表)中的差异(如总线宽度和可寻址内存) 个人电脑BIOS的历史研究。

除了一些早期的笔记本CPU(如386SX)外,所有英特尔80386 更晚的,如80486(1989年末),能够寻址4GiB的内存。但是i486通过的最大内存量 基于第六代中央处理器的PC(即奔腾赛扬专业版/-II/-Ⅲ和赛扬™™)可以经常使用 由主板制造商提供的内存控制芯片决定。例如,一个特定的 华硕™主板(CUSL-2C);2000年左右,仅为Socket 370Pentium™III或赛扬™处理器设计 支持高达512 MiB[1](即使至少可以访问4 GiB的CPU 可使用15年),由于其MCH(内存控制器集线器)的限制。[2]。

64位处理器的出现意味着计算机可能在未来的某个时候访问多达16个EIB(16个二进制Exa字节)的内存。然而, 所有第7代和第8代64位CPU的制造都远远少于64位地址线;36位 (对于64 GiB)和现在的40位(对于1 TiB)很常见。如上所述,PC的芯片组(如其MCH)通常 关于记忆的限制因素;而且通常仍然是正确的。例如,2007年的千兆字节™GA-G33M-DS2R,带 一个LGA775插槽,适用于许多不同的英特尔64位CPU,最多只支持8 GiB[3]个 由于其82G33图形和内存控制器集线器(GMCH)的限制,系统内存。[4]。

当然,为了通常使用超过4GiB的RAM,还需要64位操作系统。(注: 安装了4 GiB的32位操作系统的PC通常只显示3.2到3.3 GiB的可用空间,因为可寻址的硬件; 尤其是板载视频控制器,可能会使用数百MB作为自己的支持。)

中的更改如何影响BIOS代码,我们将有更多要说的 这些处理器可以访问的内存量。

在PC的历史进程中,BIOS代码存储在许多不同类型的非易失性文件中 存储器,其中第一个是真正的只读存储器(ROM),因为它的编程必须编码在 在它被制造的时候就是芯片。因此,早期IBM个人计算机上的BIOS芯片上通常印有线条 它不仅指明了制造商的IC类型,而且还指明了它包含的代码的IBM部件号。在……里面 下面的照片是AMD™(先进微设备公司)的徽标。可能是你最先注意到的,在4号楼 在U30上,你还会发现摩托罗拉™蝙蝠翼的标志(在一个小圆圈内)的标志。第一 左边的芯片(U33),行";1501476/AM9264DPC/34146/8407VPM,";包含ibm的基本输入输出系统代码。 5150型,其零件号(1501476)将其标识为该代码的第三个版本(1982年10月27日)。这些是 所有24针、8K字x 8位ROM,基本输入输出系统/开机自检代码只有8 KiB长;U29(5000019)、U30(5000021)、 U31(5000022)和U32(5000023)包括32KiBROM基本代码。

从. 2008年照片,由Rune Tapper提供,pc-museum.com。(这个特定的IBM 在1984年第8周之后的某个时间,5150块芯片已经在苏格兰的格林诺克制造出来了,因为一些芯片被焊接起来了。(工业和信息化部电子科学技术情报研究所陈皓) 请注意U30和U32上的';8408';)。

对于测试或甚至是小规模生产运行,PROM(仅限一次,可编程 ROM)或EPROM(可擦除可编程ROM)可能已在某些计算机上使用,因为制造商 然后可以测试和使用修改后的代码,并且不会在库存中留下任何具有错误或过时数据的ROM。 PROM和EPROM通常都有以27开头的零件号,但EPROM的顶部有一个小石英窗 (通常用标签覆盖),所以它的记忆可以用特定的高强度紫外光来擦除; 它可以重复使用。很久以后,主板制造商为各种类型的EEPROM设计了电路和实用程序 (电可擦除可编程ROM;部件号通常以28或29开头)允许用户 重新编程他们自己的PC的BIOS。[这也意味着如果在以下情况下发生断电,代码可能会损坏 升级过程!当然,拥有已知良好的备用电池电源可以防止出现这种情况。]。

如果BIOS芯片损坏,则需要购买预先编程的替换芯片;除非 用户非常不幸地发现PC制造商已经将BIOS芯片焊接到电路板上了!即便如此,BIOS芯片 通常仍然有24个相当大的引脚,电子爱好者可以禁用(或切断)旧芯片并焊接 无需拆卸旧芯片,即可在现有支脚(管脚)上安装新的管脚(管脚)。当然,如果编程芯片的成本是 太高了,那么功能更多的更好的电路板就会胜出。与BIOS芯片相关的最差主板类别是 那些将代码存储在焊接到电路板上的芯片中,并且还要求用户在Windows下运行升级, 在没有其他东西运行的情况下!因此,如果忘记断开网线或使用任务管理器杀死除 必要的过程,意味着你可以很容易地把这样的主板变成一块无用的垃圾!具有更好设计理念的PC有一个内置的引导例程,该例程将保持不变,因此 允许用户从失败的BIOS升级中恢复。和较新的主板,可能具有双BIOS系统[5],因此用户可以从未处于启动过程中的辅助BIOS芯片重新启动 在发生断电或其他事件时更改。当PC再次启动时,它将使用辅助BIOS和用户 可以返回重新编程主BIOS芯片。取决于电路板制造商决定如何实施他们的 双BIOS设计,第二个芯片可以是安全芯片,它是只读的,永远不能更改(GB的设计); 它有一个坚实的优势,那就是有一些总是可以依赖的BIOS代码,除非它也有硬件故障。 或者,在确定没有更新成功的芯片的内容之后,可以存在将成功升级的芯片的内容复制到另一个BIOS芯片的例程 更新的代码有问题。然后,BIOS可以检查复制的代码是否与升级后的芯片的代码匹配 允许再次升级(显然更难编程,可能会允许黑客的代码成为您的新备份代码)。

今天,PC的BIOS可能驻留在一个小的8针串行闪存中(例如 Macronix™MX25L8005;具有引导锁保护的8Mbit或1024KiB芯片),其代码由 主板的南桥(如英特尔的ICH9;I/O控制器集线器9)用户

一旦您有了芯片组数据,您就可以搜索芯片制造商的网站,了解芯片中的数据是如何 可能会被访问;独立的实用程序程序员可以使用该数据来显示BIOS芯片的实际内容,如下所示 以及由主板制造商在其自己的BIOS升级程序中使用。一些电路板制造商甚至可能提供 基于Windows的实用程序来复制您的BIOS代码![注意:我们不建议执行BIOS升级,除非 我们向您保证,它将允许您的PC以您需要的新方式运行;例如识别更大的磁盘驱动器, 或者解决问题。我们只是指出,使用软件工具从PC的BIOS芯片复制代码可能很容易; 在不考虑BIOS代码可能损坏的情况下,不要使用此类工具覆盖BIOS代码。]。以下内容 显示了在PC上运行的一个这样的实用程序(我们使用PrintScreen键来捕获其图像;在以下情况下千万不要执行此操作 正在升级!)。并添加了黄色矩形和标题:

这 实用工具甚至显示了用于存储BIOS代码的内存芯片的类型:";MX(IC)25L8005&34;以及它的8Mbit 能力。

注意:对于任何希望在现代PC上访问BIOS代码的人-没有这样的实用程序,您首先需要 要了解如何使用Intel的Low Pin Count Specification以及不同超级I/O芯片制造商的LPC I/O接口中任何可能的变体, 然后找出如何与实际的BIOS芯片本身进行通信;该芯片也可以是不同制造商的8针或32针闪存芯片。

几乎每台PC,从1981年生产的第一台IBM®个人计算机到最新的 基于英特尔®或AMD®的PC,其CPU中硬连线的内存地址与 参考其第一条指令![6]这意味着每台PC的CPU都将始终启动 从其BIOS芯片内部本质上相同的位置执行机器代码指令,或者用于必须 首先将它们的BIOS代码从内存中的等效位置移动(或解压缩)到内存中。该地址是:

F000:FFF0(在线段:偏移记法中)或:FFFF0h (使用线性记数法)。您可能还会发现它由FFFF:0000表示[请参见 图1;如IBM原始技术参考手册中所列;P/N 6025008],或仅作为FFFF:0(归一化 段:偏移表示法)。[请阅读我们的 有关Segment:Offset Addressing(段:偏移寻址)的页面,请了解FFFF:0为什么等同于Segment:Offset(段:偏移)对 F000:FFF0。]。

IBM®将此地址命名为开机重置 向量,并且它始终包含到 BIOS芯片的开机复位代码。这里显示的是您在该位置找到的内容以及原件接下来的12个字节 IBM®PC的BIOS芯片:

偏移量:0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII字符。- 0FFFF0 EA 5B E00 F0 30 34 2F 32 34 2F 38 31 FF EB.[...04/24/81...。

(两个FF字节用作填充,FFFFFh处的EB是BIOS 校验和字节。)

前五个字节(显示为绿色 )包括开机重置远跳转(Power-On Reset Far Jump)。这5个字节反汇编为:

如您所见,段F000:嵌入在此指令中,因此 其位置通常引用为F000:FFF0的原因。虽然这次跳远的地点 指令本质上是一成不变的对于所有的PC BIOS,它并不要求它总是跳到下一个位置 都是一样的;然而,我们检查过的每台PC BIOS都会跳到F000:E05B;。

在被指派制造IBM个人计算机(5150型)的12名IBM工程师中, 大卫·J·布拉德利(David J.Bradley)[7]为它的BIOS开发了代码。所以他就是那个,在所有的事情中 其他细节,决定BIOS将放置和执行IBM PC第一个扇区的代码在内存中的哪个位置 软盘的引导记录。他选择的位置是0x 7C00(或段:偏移表示法中的0000:7C00)。不像 上面提到的第一个跳转地址(偏移0xE05B),后来的BIOS作者不可能选择不同的位置 在内存中加载初始引导例程,而不会使其代码与现有引导盘不兼容! 因此,IBM(以及随后的所有PC克隆公司)继续使用内存中的相同位置存储硬盘驱动器 主引导记录(MBR)。

接下来的8个字节(以黄色显示)最初称为";版本标记"; 由IBM创建;它们始终包含 BIOS代码(第一批PC为04/24/81)。

附录A-80页的部分ROM BIOS列表,位于 技术参考手册(ibm部件号,6025008),第一版(1981年8月), IBM个人计算机硬件参考库。* (单击上图查看更大尺寸。)如图1所示。

[在图1中,这台机器有一个错误 JMP重置指令中开机重置代码位置的代码列表。这就是为什么 “IBM个人计算机技术参考手册”的原件已经印刷完毕。本应列为:EA5B E000F0,而不是";EA5B 0000F0";; 如果您检查A-5页上显示的地址,很明显它是从我们指定的地址开始的。]。

从DOS到WindowsWindows7(32位)运行微软/IBMOS的任何人都应该能够进入 以下调试命令(Windows用户必须首先单击Start->;Programs->; 附件->;命令提示符,打开命令提示符窗口。Windows 7用户可能需要 选择命令提示符图标旁边的以管理员身份运行以访问调试),并获得类似于 以下(DEBUG.EXE应该已经在您的路径中):

C:\>;debug-d f000:fff0[至';转储';内存段的最后16个字节。]。F000:FFF0 EA 5B E0 00 F0 30 34 2F-31 34 2F 30 33 00 FC 48.[...04/14/03..H- -u f000:fff0 L5[";L5";代表';长度为5个字节。]。F000:FFF0 EA5BE000F0 JMP F000:E05B - -q[退出调试。这是关于退出的问题。]

输入以绿色显示的命令 在调试提示符下(";-";)。您可以看到,我们的跳转指令与最初的个人跳转指令相同 计算机,但此BIOS代码是在2003年4月14日发布的(";04/14/03";)。(有关详细信息,请参阅 有关DEBUG的使用,请参阅我们的MS-DEBUG指南)。

这是一个WindowsBIOS 7(32位)命令提示符,使用DEBUG显示其PC的™发布日期 ";06/18/09";:

在早期的PC上,RAM是一种昂贵而有限的资源,它被尽可能明智地用于 执行用户的程序。由于原始PC只需16 KiB(16 x 1024字节)即可购买 =16,384字节)的内存,我们知道不可能容纳32 KiB的ROM Basic代码 进入记忆。但是使用一半的可用内存来编写即使是8 KiB的初始引导代码 没有意义,因为它可以从它自己的ROM芯片访问,速度和动态RAM芯片中的任何代码一样快;两者都有 250纳秒的访问时间[8]。一旦RAM变得比ROM或EEPROM IC快得多 而且PC通常有许多兆字节的内存,系统工程师有足够的动机首先复制引导例程 从BIOS代码到内存中,然后在那里执行它。这使得BIOS程序员能够探索许多 将代码隐藏在RAM中的其他优点,我们将在下一节中指出。但首先,我们需要 要提到一些方法来复制在PC启动后仍保留在内存中的任何BIOS代码:

如上所述,对于第一代PC,BIOS代码总是必须直接从其芯片读取。 不仅在PC启动时,而且在每次程序使用系统中断或需要访问任何其他BIOS时 存储在其ROM(只读存储器)芯片中的代码。在那些日子里,对应于最后一段的地址线 内存仅硬连线至BIOS芯片内的位置。后来,人们制造了带有BIOS代码的个人计算机 首先复制到RAM中,然后从那里使用,而不是直接从BIOS芯片使用。如果您可以访问具有以下功能的PC 一个Int。

.