想写 BIOS 研究系列已久,今天开始以旅程的方式边写边研究 BIOS,这是一个边写边学习的过程,从基本为起点站,何时为终点站不清楚,希望能坚持下去,期间难免会有错误之处,敬请指正。
研究 BIOS 是一项赋挑战的工作,难度好比研究 kernel 代码,BIOS 是极具吸引力的。读懂它对计算机系统将有质的飞越。
预备
一、所需材料
1、主要BIOS :ex38dq6.f2 :技嘉主板上Intel X38 MCH + ICH9 平台。
备用 BIOS:ma79xds4.f4 : 技嘉主板上AMD 790X 北桥 + SB600 南桥平台。
2、cbrom:这是一个BIOS编辑工具,这里所用的是cbrom182版本
3、lha2.55:LHA格式的解压工具。
4、awdbedit:award bios 的图形化编辑工具,方便简单。
5、hex workshop:一个十六进制编辑工具,简单小巧。
6、IDA:一个反汇编工具,这里使用的是IDA 5.2版本
二、所需知识
1、汇编语言:这是必备的知识,汇编掌握的程度和理解能力成正比。
2、机器语言:这个不是必需的,但推荐能够读懂机器语言,某些场合下当汇编语言也陷入窘境时,机器语言是唯一的解释手段。
3、x86体系知识:具体可以查看相关的Intel 或 AMD 手册
4、ISA/PCI 总线知识:可以查看相应的 ISA/PCI Specification
5、north/south bridge 知识:Intel 现在以MCH代称north bridge,ICH代称south bridge,可以查看相应的 datasheet起点:几个重要知识
一、地址空间解析
(1) 0 ~ 9_FFFF:属于DOS的基本内存,被MCH控制提交到DRAM。
(2) A_0000 ~ B_FFFF:此区域能提交到Device 2(集成显示设备)、Device 1(PCI Express接口设备)以及提交到ICH进行处理。按Dev2/Dev1/ICH优先顺序进行映射。
当处理器在SMM模式下,此区域供SMM 使用,此时,此区域将被MCH提交到DRAM相同的位置上。
(3) C_0000 ~ F_FFFF:共256KB的区域被称为PAE(Programed Attribute Memory)区域,可定义4种类型属性:Disable、Read/Write、Read-Only以及Write-Only。根据这些操作类型可以提交到DRAM和ICH处理。这些区域的初始状态是Disable属性,也就是说,缺省时将得交到ICH处理。可由BIOS BOOTLOCK进行对类型的属性设置,从而达到shadow memory效果。。
(4) E_0000 ~ E_FFFF:典型地被用作BIOS使用。俗称E_Segment。
(5) F_0000 ~ F_FFFF:被提交到LPC总线上的BIOS,它是High BIOS的别名,初始属性是disable,将被MCH控制直接提交到ICH处理。俗称F_Segment。
(6) F0_0000 ~ FF_FFFF:这1M的空间可以选择保留给ISA使用,这段空间将不提交至DRAM,转交ICH处理。
(7) TOLUD(Top Of Low Usable DRAM)由Host Bridge Registers设置,在地址空间最低DRAM memory区域的顶端,在TOLUD下的TSEG区域可设置为1M、2M或8M,processor在SMM模式下将被提交至DRAM相同地址上。
(8 ) IGD区域:可供MCH内部集成的Graphics Device使用,MCH内被定义为Device 2。大小由1M ~ 64M。
(9) E000_0000 ~ EFFF_FFFF:这段空间典型地被用作为PCI Express 配置空间,由Host Bridge(Dev0)的PCIEXBAR寄存器设置。缺省的Pci Express Base Address设置为0_E000_0000,共256M大小。每个Device的每个Functon大小为4K(包括PCI的256 Byte和PCI Express增强的空间共4K)
★ PCI Express Bus 定义了256条Bus:Bus0 ~ Bus255,每条Bus下可挂32个设备:Device0 ~ Device 31,每个设备下又可执行8个Function:Function 0 ~ Function 7。
★ PCI Express空间大小可得:256 × 32 × 8 × 4096 = 256M
(10) FEC0_0000 ~ FEC7_FFFF:这段区域固定分配IOAPIC中断控制器使用,访问这段区域将被提交到ICH处理。
(11) FEC8_0000 ~ FECF_FFFF:附加的APIC增加区域提交至 PCI Express 端口,当不设此区域时,整个APIC 配置区域(FEC0_0000 ~ FECF_FFFF)将提交至 ICH。
(12) FEDA_0000 ~ FEDB_FFFF:可选为HSEG区域以供SMM模式下使用。被重新映射至A_0000 ~ B_FFFF区域。
(13) FEE0_0000 ~ FEEF_FFFF:这段区域保留给FSB中断信号使用。当PCI Express 或 ICH上的设备往这段区域写数据时,将以中断信号形式提交至FSB上,不会提交到DRAM。
(14) FFE0_0000 ~ FFFF_FFFF:此区域固定分配给BIOS 使用。共2M空间,将直接提交至ICH处理。
二、关于PCI Bus
1、PCI Bus是一种原生32位,通过Dual Address Cycle形式来实现64位寻址的数据总线。
2、PCI的配置寄存器集成在MCH(North Bridge)内部:CONFIG_ADDRESS寄存器和CONFING_DATA寄存器,通过端口 CF8H ~ CFBH 来实现32位数据访问 CONFIG_ADDRESS寄存器;通过端口 CFCH ~ CFFH 来实现32位数据访问 CONFIG_DATA 寄存器。
3、PCI 设备访问地址如下:
31 | 30 ~ 24 | 23 ~ 16 | 15 ~ 11 | 10 ~ 8 | 7 ~ 0 |
1 | 保留 | Bus | Device | Function | Offset |
4、访问的形式:
mov eax,80000090h
mov dx, CF8h
out dx, eax
mov dx, CFCh
in eax,dx
… …
起点:几个重要知识(续)
三、I/O 空间
1、系统提供的64K IO寻址空间(0 ~ FFFF)划分几种情况:
★分为MCH(hostbridge) 使用和 ICH 使用,大部分供ICH外部设备使用。例如:CF8h ~ CFFh 这些端口固定分配供MCH用来访问PCI Configuration Space。★分为系统固定分配及按情况进行分配。如:0 ~ 1Fh 端口固定分配给ICH的DMA 控制器使用。
★一些端口被保留未用。
2、一般PCI设备都可选用memory空间和IO空间进行设备访问。在PCI设备的configuration Register可对PCICMD寄存器的IOSE位设为IO空间访问,根据IOBASE及IOLIMIT寄存器设置IO端口地址。
四、MCH(hostbridge)提交到ICH后的转发处理
ICH包括PCI-to-PCI bridge 、PCI-to-ISA bridge、USB Controller、PCI Express Ports等等。ICH收到经MCH提交来的地址,相当多都分派到PCI-to-ISA bridge(LPC Controller)中的Firmware Hub及LPC bus。
第一站:剖析First Instruction Executed
一、Processor 寄存器初始状态
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="Click here to open new window CTRL+Mouse wheel to zoom in/out" border="0" width="716">
1、CR0.PE = 0,处理器处于实模式
2、RIP = FFF0h
3、CS.Base = FFFF_0000h
4、由于在实模式下,第一条指令的物理地址就在:CS.Base + RIP = FFFF_FFF0h。
二、MCH(NorthBridge)的处理
FFFF_FFF0h地址由Processor送到MCH进行解析,这个地址落在MCH固定为High BIOS 分配的区域中,MCH直接通过DMI接口送到ICH进行处理。
MCH相当于一个派发者角色,根据定义的地址映射分派到不同的接口。
三、ICH(SouthBridge)的处理
1、ICH对MCH提交过来的地址进行解码。
2、ICH的地址映射机制中:FFFF_FFF0地址落 FFF8_0000 ~ FFFF_FFFFh这个范围中,这个范围的地址将直接分派到LPC接口的Frimware Hub进行处理,LPC 接口相当于一个PCI-to-ISA 桥,BIOS寄居在LPC bus上,从而访问BIOS区域。
3、在物理器件上,ICH Firmware Hub的IDSEL选择固定地址设为FFF8_0000 ~ FFFF_FFFF范围,LPC接口寄存器(B#0, D#30,F#0)中的,Firmware Hub Decode Enable寄存器的bit15固定为1,允许FFF8_0000 ~ FFFF_FFFF地址提交到Firmware Hub。这样确保FFFF_FFF0提交到LPC bus。
ICH相当于一个解码器角色,解码后分配任务给设备执行。
四、第一条指令执行
经典地在FFFF_FFF0绝大多数是一条far jmp指令:jmp far ptr 0F000h:0E05Bh,不同的BIOS跳转的地址或许不同。这条指令跳转到FE05B这个地址上执行。同时刷新CS.Selector、CS.Base以及EIP寄存器。引一段 Intel 的话:
The first instruction that is fetched and executed following a hardware reset is
located at physical address FFFFFFF0H. This address is 16 bytes below the
processor’s uppermost physical address. The EPROM containing the software initialization
code must be located at this address.
The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor
while in real-address mode. The processor is initialized to this starting address as
follows. The CS register has two parts: the visible segment selector part and the
hidden base address part. In real-address mode, the base address is normally
formed by shifting the 16-bit segment selector value 4 bits to the left to produce a
20-bit base address. However, during a hardware reset, the segment selector in the
CS register is loaded with F000H and the base address is loaded with FFFF0000H. The
starting address is thus formed by adding the base address to the value in the EIP
register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
以上这段文字表明,Intel从架构上规定了,processor复位后,FFFFFFF0H地址上必须包含一些初始化程序,BIOS必须在定位在这段地址区域上。
MCH与ICH的配合从物理上通过地址映射机制保证了这一点的实施。
五、验证一下FFFF_FFF0地址上是否是一条far jmp指令,可以简单地打开cmd窗口执行debug命令。
C:>debug
-d F000:FFF0
F000:FFF0 EA 5B E0 00 F0 30 32 2F 32 37 2F 30 38 00 FC
EA 5B E0 00 F0 就是 jmp far ptr F000:E05B 指令,这条指令跳转到FE05B的物理地址上,这将是 BIOS 的 BOOTBLOCK。
第一站:剖析First Instruction Executed(续)
六、BIOS地址空间高端与低端的别名机制
1、在整个地址空间中 FFE0_0000 ~ FFFF_FFFF 这段2M 区域真正地被固定分配给 BIOS 使用,包括基本的 BIOS 区以及一些设备扩展的 BIOS 区。这段空间是不能提交至 DRAM 的。
2、实际上,BIOS的低端地址C_0000 ~ F_FFFF 属于PAM区 (即:Programmed Attibute Memory) ,这段区域可被赋为4个访问属性:disable,read-only,write-only 以及 read/write。根据访问属性的不同可被提交到ICH,也可以提交DRAM,但初始化的属性是Disable,为DRAM不可用,初始状态是通过DMI提交到ICH处理的,但是可以在 BIOS 代码修改的,从而提交至DRAM。
3、C_0000 ~ F_FFFF 与 FFFC_0000 ~ FFFF_FFFF 指向同一个区域,被冠以别名称呼,即C_0000 ~ F_FFFF 被映射到 FFFC_0000 ~ FFFF_FFFF。
AMD 如是说:
Accesses to BIOS space in the low megabyte (between 000C_0000h and 000F_FFFFh) are mapped to the top megabyte (between FFFC_0000h and FFFF_FFFFh) on the LPC bus; the OAR locks for these apply to these accesses based on the remapped address at the top megabyte.
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" border="0">
无论是C_0000 ~ F_FFFF,还是 FFFC_0000 ~ FFFF_FFFF 最终结果都将送到LPC bus上的FFFC_0000 ~ FFFF_FFFF 地址上。
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" border="0">
类似地,Intel 如是说,这里列出一小部分:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" border="0">
AMD 与 Intel 在物理上,确保了这一别名机制。
第二站:分解BIOS
注意:本站点讨论的部分内容不详,还没了解透,定义为:不清昕,可能有错误的。
这里主要以Intel平台的BIOS文件讨论,辅助参考AMD平台的BIOS文件。要分解的BIOS文件选了当下较新的X38芯片组平台的ex38dq6.f2 这个BIOS文件,而BIOS的文件是ma79xds4.f4,这是AMD的最新的7系芯片组其中的790X芯片组平台。
好,下面开始进行分解ex38dq6.f2这个BIOS文件。
一、工具的使用
1、Ex38dq6.f2是Award Bios,有一个图形化的BIOS编辑软件awdbedit,可以很方便的将BIOS的组件分解出来。
2、通用的BIOS编辑软件cbrom,这里使用的是cbrom182版本。下面是使用cbrom182显示BIOS组件的清单,命令行下使用:Cbrom182 ex38dq6.f2 /D,结果如下(部分):
******** ex38dq6.f2 BIOS component ********
No. Item-Name Original-Size Compressed-Size Original-File-Name
================================================================================
0. System BIOS 20000h(128.00K)15478h(85.12K)ex38dq6.BIN
1. XGROUP CODE 0FC40h(63.06K)0B0ECh(44.23K)awardext.rom
2. ACPI table 04E16h(19.52K)0193Ch(6.31K)ACPITBL.BIN
3. EPA LOGO 0168Ch(5.64K)0030Dh(0.76K)AwardBmp.bmp
4. GROUP ROM[18] 031D0h(12.45K)0225Ah(8.59K)ggroup.bin
5. YGROUP ROM 0C180h(48.38K)066E4h(25.72K)awardeyt.rom
6. GROUP ROM[ 0] 08210h(32.52K)0303Dh(12.06K)_EN_CODE.BIN
7. PCI ROM[A] 10000h(64.00K)09DBEh(39.44K)ICH9RAID.BIN
8. PCI ROM 03600h(13.50K)02553h(9.33K)ICH8AHCI.BIN
9. PCI ROM[C] 07A00h(30.50K)04479h(17.12K)JMB59.BIN
10. MINIT 08220h(32.53K)0824Fh(32.58K)DDR2_MRC.X38
11. PCI ROM[D] 0C800h(50.00K)079FDh(30.50K)rtegrom.lom
12. LOGO1 ROM 00B64h(2.85K)00520h(1.28K)dbios.bmp
13. LOGO BitMap 4B30Ch(300.76K)07EEEh(31.73K)x48dq6.bmp
14. GV3 01EFDh(7.75K)00B66h(2.85K)PPMINIT.ROM
15. OEM0 CODE 028ABh(10.17K)01E1Bh(7.53K)SBF.BIN
(SP) NCPUCODE 1D000h(116.00K)1D000h(116.00K)NCPUCODE.BIN
Total compress code space = E5000h(916.00K)
Total compressed code size = 75C8Dh(471.14K)
Remain compress code space = 6F373h(444.86K)
清单: 2.1
整个ex38dq6.f2 文件1M大小,包含了16个组件,最后的NCPUCODE.BIN组件,是虚拟的或者说物理上不存在,用awdbedit软件分解不包括这个组件,实际上只有15个真实组件,这些组件全都是经过压缩的。
第2列是组件的名字,第3列是组件真实的大小,第4列是组件中部分压缩的数据在ex38dq6.f2文件中的大小,最后1列是分解后组件存在磁盘上的物理文件名,以ex38dq6.bin为例,这个组件真实的大小为128K,其中85.12K是压缩部分,其余的以纯代码形式分布在FE000 ~ FFFFF区域,典型地:第一条far jmp就分布在这个区域。
ex38dq6.BIN 是BIOS的主体组件。
awardext.rom、awardeyt.rom 是BIOS的扩展部分。
ACPITBL.BIN 是供ACPI所使用的低级部件,可供操作系统使用。
PCI ROM 是 PCI 设备的一些组件。
还有一些显示的BMP图片
其余组件不详,有待了解
3、使用cbrom182来分解组件的方法:
Cbrom182 ex38dq6.f2 /XGROUP extract 分解出 awardext.rom
Cbrom182 ex38dq6.f2 /ACPI extract 分解出 ACPITBL.BIN
如此类推,可以逐步分解出各个组件,但是,SYSTEM BIOS组件,也即是 ex38dq6.bin 这个组件,我怎么试也没分解出来,所以用以下推荐的方法分解。
4、推荐分解BIOS组件的方法
使用图形化的BIOS编辑软件awdbedit可以很方便简单分解全部的组件。运行awdbedit软件,打开ex38dq6.f2,忽略掉一些警告信息,进入后,选择 [Actions] –> [Extract All] 就可以分解出全部的组件。
二、BIOS组件位置分析
1、ex38dq6.f2文件共1M大小,除了包含各个BIOS组件外,还充斥着大量的“填充码”,这些“填充码”是FF字节以及00字节,主要用来分隔各个组件,以及填充文件。
2、压缩组件是以LZH形式压缩,每个压缩组件以“-lh5-”开头,十六进制码形式为 2D 6C 68 35 2D,这是压缩组件的戳记,因此,在BIOS文件中只要寻找到这个戳记就可以区分开每个组件。
seg000:0000 24 F7 2D 6C 68 35 2D 50 54 01 00 00 00 02 00 00 $?lh5-PT.....
seg000:0010 00 00 50 20 01 0B 65 78 33 38 64 71 36 2E 42 49 ..P ex38dq6.BI
seg000:0020 4E 24 D3 20 00 00 2D 20 8F 77 BF 74 89 29 BB AA N$?..- 弚縯?华
seg000:0030 7F 33 33 37 37 4D 07 73 55 45 55 78 35 91 D5 66 3377MsUEUx5懻f
seg000:0040 85 B7 54 49 34 52 21 0E 9B A5 10 91 11 BC 1D 28 叿TI4R!洢??(
seg000:0050 B1 2A 66 A0 DD 5B BB BA 9C 0D 51 0C C5 17 AA F2 ?f犦[缓?Q?
seg000:0060 FB DD BC AC AD 34 F1 55 DB 53 CC 03 DD A6 86 30 棘?馯跾?荭?
seg000:0070 2A CF 42 B5 DC 53 52 22 43 F0 75 84 66 40 00 77 *螧弟SR"C饀刦@.w
seg000:0080 7F FE 66 83 37 77 79 E7 9E BC F6 FF BD 7A FD EE �?wy鐬荐�絲
seg000:0090 BE FF 04 3E F7 76 B2 49 1B 6D C9 D1 4B 2D 15 A0 ?>鱲睮m裳K-?
seg000:00A0 AE 84 C4 52 58 5F FF CF ED 24 AC C1 42 64 1F F0 畡腞X_�享$Bd?
seg000:00B0 BF 45 55 49 0A A2 CE C2 97 58 58 AF 0E 62 22 84 縀UI⑽聴XX?b"?
seg000:00C0 7E CF 94 2F E7 24 F7 E3 CE 0F 55 B8 E0 94 E0 D5 ~蠑/?縻?U膏斷?
seg000:00D0 D1 BE E0 9E FB 99 C1 F8 3B 86 C5 B8 86 6C 6B 85 丫酁麢柳;喤竼lk?
seg000:00E0 88 B3 F7 05 5A F0 BA CB C3 2E 5F 89 F8 AF ED B2 埑?Z鸷嗣._夬?
seg000:00F0 91 9C 42 50 B7 CA 60 34 B6 4A 55 8C 65 D3 8E EA 憸BP肥`4禞U宔訋?
seg000:0100 6A 5D E1 4F 7E DB 97 7F 4C A0 AE 9E 15 B7 8E 86 j]酧~蹢L牣?穾?
清单 2.2
3、以ex38dq6.f2为例,用十六制编辑软打开,从00000000开始到000FFFFF共1M的大小,每个压缩组件在ex38dq6.f2的物理位置如下:
0. 0 ~ 15477: System Bios (ex38dq6.bin)
1.15478 ~ 20563: XGROUP CODE(awardext.rom)
2.20564 ~ 21E9F: ACPI table(ACPITBL.BIN)
3. 21EA0 ~ 221AC: EPA LOGO(awardBmp.bmp)
4.221AD ~ 24406: GROUP ROM[18](ggroup.bin)
5.24407 ~ 2AAEA: YGROUP ROM(awardeyt.rom)
6.2AAEB ~ 2DB27: GROUP ROM[0](_EN_CODE.BIN)
7.2DB28 ~ 378E5: PCI ROM[A](ICH9RAID.BIN)
8.378E6 ~ 39E38: PCI ROM(ICH8AHCI.BIN)
9.10. 39E39 ~ 46500: PCI ROM[C]、MINIT(JMB59.BIN、DDR2_MRC.X38)
11.46501 ~ 4DEFD: PCI ROM[D](rtegrom.lom)
12.4DEFE ~ 4E41D: LOGO1 ROM(dbios.bmp)
13.4E41E ~ 5630B: LOGO BIGMAP(X48DQ6.bmp)
14.5630C ~ 56E71: GV3(PPMINIT.ROM)
15.56872 ~ 58C8C: OME0 CODE(SBF.BIN)
以上是各个压缩组件在BIOS文件中的物理位置,从58C8D ~ FDFFF 这段区间中混合着一些数据,还在大量充斥着“填充码”,没有什么实际的意义,或者说:没看到什么实际意义。
从 FE000 ~ FFFFF 这段区间中,包含一些非压缩的纯二进制代码,其中有重要的BOOTBLOCK,以及一些初始化代码。也包含着大量的“填充码”。这些纯代码分散分布在这个区间,纯代码与部分压缩组件的混合在一起,几乎很难区分哪些是纯代码,哪些是压缩数据,指令:jmp far ptr 0F000:0E05B 与其它数据混合在一起,如下清单2.2所示:
seg000:FFB25 db 0C3h ; ?
seg000:FFB26 db 66h ; f
seg000:FFB27 db 0EFh ; ?
seg000:FFB28 db 8Bh ; ?
seg000:FFB29 db 0D7h ; ?
seg000:FFB2A db 8Eh ; ?
seg000:FFB2B db 0D9h ; ?
seg000:FFB2C ; ---------------------------------------------------------------------------
seg000:FFB2C jmp far ptr 0F000h:0E05Bh
seg000:FFB2C ; ---------------------------------------------------------------------------
seg000:FFB31 db 0
seg000:FFB32 db 0
seg000:FFB33 db 0
seg000:FFB34 db 0
seg000:FFB35 db 0
seg000:FFB36 db 0
seg000:FFB37 db 0
seg000:FFB38 db 0
seg000:FFB39 db 0
清单 2.3
4、BIOS的主体文件 ex38dq6.BIN的大小是128K,正好映射到系统地址空间的FFFE_0000 ~ FFFF_FFFF(E_0000 ~ F_FFFF)共128K的空间上。
当分解出BIOS主体组件ex38dq6.BIN后,这条指令就在F000:FFF0 的位置上,如下清单2.3所示:
seg000:FFFEC db 80h ; €
seg000:FFFED db 1
seg000:FFFEE db 0Ch
seg000:FFFEF db 89h ; ?
seg000:FFFF0 ; ---------------------------------------------------------------------------
seg000:FFFF0 jmp far ptr 0F000h:0E05Bh
seg000:FFFF0 ; ---------------------------------------------------------------------------
seg000:FFFF5 db 30h ; 0
seg000:FFFF6 db 32h ; 2
seg000:FFFF7 db 2Fh ; /
seg000:FFFF8 db 32h ; 2
seg000:FFFF9 db 37h ; 7
seg000:FFFFA db 2Fh ; /
seg000:FFFFB db 30h ; 0
seg000:FFFFC db 38h ; 8
seg000:FFFFD db 0
seg000:FFFFE db 0FCh ; ?
seg000:FFFFF db 0B3h ; ?
seg000:FFFFF seg000 ends
清单 2.4
在ex38dq6.BIN 文件中的FFFF0位置对应着物理FFFFFFF0这个地址上,第1条指令是far jmp,跳转到BOOTBLOCK中,通常在这条指令的周围是些有意议的字符描述,如:02/27/08这是BIOS日期,在far jmp 下面处于BIOS尾端。
三、不同BIOS文件之间的异同
1、结构不同,AMI和award的BIOS是有差别的。
2、BIOS文件的大小不同,一般的BIOS文件大小为512K,以ma79xds4.f4为例,它是512K,ex38dq6.f2是1M,但结构上差什么差异,下面是ma79xds4.f4的结构:
No. Item-Name Original-Size Compressed-Size Original-File-Name
================================================================================
0. System BIOS 20000h(128.00K)13944h(78.32K)ma79xds4.BIN
1. XGROUP CODE 0F7D0h(61.95K)0AB7Bh(42.87K)awardext.rom
2. ACPI table 06391h(24.89K)02B35h(10.80K)ACPITBL.BIN
3. EPA LOGO 0168Ch(5.64K)0030Dh(0.76K)AwardBmp.bmp
4. GROUP ROM[18] 03340h(12.81K)02339h(8.81K)ggroup.bin
5. YGROUP ROM 0B310h(44.77K)05023h(20.03K)awardeyt.rom
6. GROUP ROM[ 0] 07100h(28.25K)02C90h(11.14K)_EN_CODE.BIN
7. PCI ROM[A] 0C800h(50.00K)0AC37h(43.05K)sata22.bin
8. OEM1 CODE 0AE4Fh(43.58K)06B6Dh(26.86K)ui22.bin
9. PCI ROM[B] 0A800h(42.00K)06007h(24.01K)RTLGPXE.LOM
10. LOGO1 ROM 00B64h(2.85K)00520h(1.28K)dbios.bmp
11. OEM0 CODE 028ABh(10.17K)01E1Bh(7.53K)SBF.BIN
12. GV3 088C6h(34.19K)026FBh(9.75K)AGESACPU.ROM
13. MINIT 11B80h(70.88K)11BB3h(70.92K)MEMINIT.BIN
14. HTINIT 04BC0h(18.94K)04BF0h(18.98K)HT.DLL
15. 2 PE32 in MB 00552h(1.33K)00582h(1.38K)HT32GATE.BIN
(SP) NCPUCODE 04000h(16.00K)04000h(16.00K)NCPUCODE.BIN
Total compress code space = 63000h(396.00K)
Total compressed code size = 621F3h(392.49K)
Remain compress code space = 00E0Dh(3.51K)
清单 2.5
上面清单所示,与ex38dq6.f2的结构一样,每个组件都有一部分是经过压缩的。
没有评论:
发表评论