Award版的Bios在主板中使用非常广泛,文件结构也不是特别复杂,所以用来进行分析还是比较合适的。Award公司的Bios除BootBlock之外的部分都要使用lha压缩后合并到最终的Bios文件中,也就是说最终的Bios文件中只有BootBlock是能直接执行的,其他部分在执行之前都需要进行解压。Award版的Bios中不同模块使用lha文件标准定义中的文件日期部分区分,主模块的识别代号是50000000,其他模块也有自己独特的区分代号,例如:ACPI
Table的代号是40030000。
BookBlock部分就在Bios文件的最后68K或128K,机器启动后,BootBolck被映射到F0000-FFFFF(64K)或者E0000-FFFFF(128K),然后机器调用FFFF0处的代码开始Post过程,Bios的这个位置基本都是一条长跳转(至少我还没见过其他类型的)。在完成最基本的初始化之后,BootBlock进入解压缩模块,对Bios的主模块进行完整性校验和解压缩,如果校验失败或者解压缩失败则会跳到BootBlock中的失败处理中,也就是一个最简单的引导模块,这个引导模块通常只支持很少的硬件设备,这个部分存在的意义就是在发现Bios文件出现问题后有一个恢复的机会,但如果是主模块内部出现问题而不是文件封装出现问题,这部分的判断是不可能起作用的。
下面配合代码对上面的说明进行解释。代码来自Abit的kN9主板V18版本Bios(网上随便找的比较新的Award Bios)
seg000:FFF0 jmp far ptr loc_FE05B
这个就是Bios执行的第一句代码,只是简单的跳到F000:E05B处继续执行
seg000:E05B jmp far ptr loc_FE200
seg000:E200 mov gs, dx
seg000:E202 cli
seg000:E203 cld
seg000:E204 mov ax, cs
seg000:E206 mov ss, ax
seg000:E208 assume ss:nothing
seg000:E208 mov ecx, 1Bh
seg000:E20E rdmsr
seg000:E210 test ax, 100h
seg000:E213 jz short $+2
seg000:E215 mov sp, 0E21Bh
seg000:E218 jmp loc_F7360
;这样的代码在跳转后的代码执行后会到sp内容指向的位置处继续执行,此处就是到E21D处继续执行。后面还有很多地方都是这样的跳转。
seg000:E218 ;
---------------------------------------------------------------------------
seg000:E21B dw 0E21Dh
seg000:E21D ;
---------------------------------------------------------------------------
seg000:E21D mov sp, 0E223h
seg000:E220 jmp loc_FF600
seg000:E220 ;
Table的代号是40030000。
BookBlock部分就在Bios文件的最后68K或128K,机器启动后,BootBolck被映射到F0000-FFFFF(64K)或者E0000-FFFFF(128K),然后机器调用FFFF0处的代码开始Post过程,Bios的这个位置基本都是一条长跳转(至少我还没见过其他类型的)。在完成最基本的初始化之后,BootBlock进入解压缩模块,对Bios的主模块进行完整性校验和解压缩,如果校验失败或者解压缩失败则会跳到BootBlock中的失败处理中,也就是一个最简单的引导模块,这个引导模块通常只支持很少的硬件设备,这个部分存在的意义就是在发现Bios文件出现问题后有一个恢复的机会,但如果是主模块内部出现问题而不是文件封装出现问题,这部分的判断是不可能起作用的。
下面配合代码对上面的说明进行解释。代码来自Abit的kN9主板V18版本Bios(网上随便找的比较新的Award Bios)
seg000:FFF0 jmp far ptr loc_FE05B
这个就是Bios执行的第一句代码,只是简单的跳到F000:E05B处继续执行
seg000:E05B jmp far ptr loc_FE200
seg000:E200 mov gs, dx
seg000:E202 cli
seg000:E203 cld
seg000:E204 mov ax, cs
seg000:E206 mov ss, ax
seg000:E208 assume ss:nothing
seg000:E208 mov ecx, 1Bh
seg000:E20E rdmsr
seg000:E210 test ax, 100h
seg000:E213 jz short $+2
seg000:E215 mov sp, 0E21Bh
seg000:E218 jmp loc_F7360
;这样的代码在跳转后的代码执行后会到sp内容指向的位置处继续执行,此处就是到E21D处继续执行。后面还有很多地方都是这样的跳转。
seg000:E218 ;
---------------------------------------------------------------------------
seg000:E21B dw 0E21Dh
seg000:E21D ;
---------------------------------------------------------------------------
seg000:E21D mov sp, 0E223h
seg000:E220 jmp loc_FF600
seg000:E220 ;