在bios中嵌入应用程序的方法及实现

上传人:第*** 文档编号:34052934 上传时间:2018-02-20 格式:DOC 页数:6 大小:58KB
返回 下载 相关 举报
在bios中嵌入应用程序的方法及实现_第1页
第1页 / 共6页
在bios中嵌入应用程序的方法及实现_第2页
第2页 / 共6页
在bios中嵌入应用程序的方法及实现_第3页
第3页 / 共6页
在bios中嵌入应用程序的方法及实现_第4页
第4页 / 共6页
在bios中嵌入应用程序的方法及实现_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《在bios中嵌入应用程序的方法及实现》由会员分享,可在线阅读,更多相关《在bios中嵌入应用程序的方法及实现(6页珍藏版)》请在金锄头文库上搜索。

1、在 BIOS中嵌入应用程序的方法及实现分类: 32位汇编语言2007-03-26 21:15 669人阅读 评论(0) 收藏 举报dos 汇编工具 stringmicrosoft 文本编辑介绍本文针对 Award 公司开发的计算机系统 BIOS 提出了一种嵌入应用程序的方法,其基本原理对别的品牌的 BIOS 也一样适用,仅需稍加修改。文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证。正文一. BIOS 简述这里所讲的 BIOS 是指计算机主板上的 BIOS,是整个计算机的关键和灵魂,计算机一启动就是执行 BIOS 程序,它负责加电自检,初始化计算系统,响应用户对系统配置的修改,记录

2、数据到 CMOS 中,将常驻程序库(Runtime Program)常驻于内存中,提供给系统和应用程序调用,经过一系列复杂操作后,最后将控制权转移给操作系统。一开始 BIOS 容量仅有 8K,随着计算机复杂程度的提高,以及即插即用、高级电源管理等方面的需要,再加上个别主板厂商添加的辅助功能,BIOS 容量迅速增大,目前通常主板上 BIOS 容量为256Kb,有些已经达到512Kb,这些 BIOS 中常常还会有几十 Kb 的剩余空间,而且由于 BIOS 多采用 FlashRom 作为存储芯片,便于修改,这就为我们在 BIOS 中嵌入自己的程序提供了便利。在 BIOS 中嵌入程序具有多方面的应用,

3、有些主板厂商在 BIOS 中嵌入杀毒程序,硬盘恢复精灵,超频工具等,提高了产品的竞争力;台湾威胜公司和 Elegent 公司联合开发出了嵌入在 BIOS 中的小型浏览器操作系统,整个 BIOS 大小仅有512Kb ,计算机无需硬盘即可上网冲浪;有些监控系统由于功能简单,完全可以把程序做到 BIOS 中,一开机就自动运行,既提高了可靠性,又降低了成本。另一方面,将病毒嵌入到 BIOS 中,一开机就常驻内存也完全可以做到。BIOS 代码虽短,但技术含量相当高,全世界仅有 AWARD、PHOENIX、 AMI、ACER 等几家公司有研发 BIOS 系统的能力( AWARD 已被 PHOENIX 收购

4、) ,其他主板厂商有的是直接购买,有的也会在以上几家公司提供的平台上进行少量功能扩展。作为个别应用的场合,就要完全靠自己对 BIOS 进行改造。二. 嵌入程序的基础知识在进行工作前需要几个必备的工具,一个是 AWARD 公司的 BIOS 刷新工具 AwdFlash;另一个Award BIOS 察看修改工具 Cbrom;还有一个是 MicroSoft 的汇编工具 Masm6.11;最后是作者推荐的二进制文本编辑器 HexWorkshop,这些工具都可以从网上下载,下面假定读者已经熟练使用这些工具,具体操作步骤不再祥述。前面提到 BIOS 程序是存放在 FlashROM 芯片中的,实际上它是经过压

5、缩后再存放进去的,仅留下少量启动代码和解压缩程序保持原样,BIOS 的执行过程其实相当复杂,好在我们无需去了解其中的详细流程,但有一点应当清楚,BIOS 程序实际上也是采用的模块化设计思想,用 Cbrom 可以察看到 BIOS 中各个子模块的名称,性质,压缩率等信息,BIOS 在执行过程中会将这些模块解压缩到内存中,验证模块的合法性和正确性,如果满足条件,就会转到模块的入口处执行。这里面的详细机制和由来需要参考 PNPBIOS 协议、PNPISA 协议、PCI 总线协议和 EISA 总线协议,内容繁多,本文不拟做深入探讨。BIOS 中有一种模块是 ISA 模块,来源于 ISA 协议,由于 IS

6、A 协议属于早期的协议,内容相对简单,BIOS 对 ISA 模块的验证也较为简单,容易满足,我们可以将自己的程序做成 ISA 模块挂到 BIOS 中,这样机器一启动,我们的程序就会启动,而且我们程序的运行是先于操作系统的。三. 程序设计详细步骤1. 设计准备由于系统固有的限制,BIOS 中每个模块的大小不能超过64Kb ,这里是指没有压缩前的大小,这和 DOS 下 COM 程序的限制很相似,实际上我们在用 MASM6.11进行编程时的确采用是COM 程序的模板,由编译器生成 COM 文件。然而它又和一般的 COM 文件具有以下几点不同:1. 首先它有自己的堆栈段,堆栈大小默认为1K,而 COM

7、 文件的堆栈是在64K 之内的,默认是从段内偏移量0FFFEh 处开始。2. COM 文件一开始就是执行代码,而模块一开始是模块头,储存有与模块相关的信息。模块执行代码的入口点在模块中的某一处。3. COM 文件执行完后返回到操作系统,通常通过子功能号4ch 的中断 INT21h 返回到 DOS,而模块是远程调用返回,也就是说必须用 RETF 返回。4. ISA 模块最后一个字节是校验码,所有的字节相加必须为 0,BIOS 利用这点来验证一个ISA 模块的正确性。 COM 文件没有这点要求。5. COM 文件执行时是先被完整地复制到段内偏移量100h 处,然后再执行,而模块的段内偏移量不能确定

8、,有的模块会是0。所以涉及到段内偏移量的汇编指令,如 LEA、OFFSET要谨慎适用。下表是 ISA 模块头的格式,其中仅列出了几个最基本的相关字段,这是协议中的内容,我们在编写模块头时,需要严格遵循下表的格式:偏 移 长 度 值 说 明0h 1 55h 模块标签字节11h 1 AAh 模块标签字节22h 1 * 模块长度(以512字节为单位)3h 3 * 入口点,BIOS 对此位置做远调用,这里往往放一条跳转指令6h19h 20 * 保留表一 模块头格式通常一个 BIOS 嵌入程序设计的基本流程如下,每一步都很关键,有必要给出详细说明:1. 首先用汇编编写 DOS 下的 COM 程序,必须注

9、意到程序是先于操作系统执行的,所以程序中不能调用任何 DOS 的中断服务。为了程序转化方便,也不要用.code,.startup 等汇编伪指令,尽量采用早期的汇编编写方式,争取对整个程序结构的完全控制。2. 调试通过后,在 COM 文件前加上文件头,改变返回指令为 RETF,控制文件大小为 512字节的整数倍,重新编译生成 COM 文件。3. 在 HexWorkshop 中调入刚生成的 COM 文件,利用其中的 checksum 工具生成文件的校验码,用100h 减去该8位校验码后填入文件最后一个字节。再次生成文件的校验码,确认为零。4. 用 Cbrom 将文件作为 ISA 模块嵌入到 BIO

10、S 中,在本文中的操作为 “Cbrom save.bin/isa ”,其中 save.bin 是事先用 AwdFlash 备份的 BIOS 文件。注意反复操作时,要先将前一个给释放掉,操作为“Cbrom save.bin/isa release”。5. 用 AwdFlash 将新的 BIOS 文件烧录到 FlashROM 中。重起计算机,检验程序。进行以上实验前,最好自备编程器,万一计算机不能正常启动,也可以重新恢复 BIOS,如果可以用本身具有双 BIOS 保护功能的计算机进行实验则更加保险。下面设计两个简单的 Hello 程序,分别采用了两种不同的方式,两个程序都是在屏幕上显示一行字“He

11、llo! Press F1 to continue”,当按下 F1功能键后,程序退出,计算机继续启动。2. Hello 程序一下面给出的源代码是在上面流程2中的文件,所以已经添加了文件头,编译后生成的 COM文件是不能在 DOS 下执行的,请读者务必注意。另外由于程序功能简单,所以在这里文件大小限制为512字节,对不同规模的程序,会有一些小小的变动。程序中所有的中断调用都是 BIOS 中断服务调用,具体调用规则不做详细说明,请读者查阅有关资料。;Hello 源程序一code segmentassume cs:code,ds:codestart:signature db 55h,0aahcoml

12、ength db 01h ;文件长512字节jmp near ptr begin0reserved db 20 dup(?)begin0:mov di,25mov ah,2mov bh,0mov dx,dimov dh,10 ;将光标移至屏幕int 10h ;10 行25列处mov si,offset string;在 DOS 下调试时应在这里添加 add si,100hshowstr:mov ah,9mov al,siand al,0ffhjz kbinputmov bh,0mov bl,0DAhmov cx,1int 10h,mov ah,2mov bh,0inc dimov dx,dim

13、ov dh,10int 10hjmp showstr ;输出字符串kbinput:mov ah,0int 16hcmp ah,3bh ;接受键盘输入jne kbinput ;按 F1往下执行mov ax,0 ;返回参数retf ;远程调用返回string db Hello! Press F1 to continue.,00h ;00h 标志字符串结束org 511 ;文件末尾checksum db ?code endsend start将上述程序烧入 BIOS 中运行时,在第一屏信息显示过后,会在第二屏正中央显示一条红底白字的信息,提示按 F1键继续,按 F1键后,BIOS 继续下面的启动步骤

14、。显示第三屏启动信息,即原先的第二屏信息,最后加载操作系统。以上程序假定了 BIOS 会将模块解压至段首运行,事实也确是如此,但由于没查到相关资料,目前还不能肯定总会如此。这一点将在下一个 Hello 程序中有所改进。3. Hello 程序二Hello 程序一在 BIOS 没有初始化完全的时候即进入运行,所以对程序功能有更多限制,有些 BIOS 中断服务还不具备,任何对这些服务的调用都会产生意想不到的结果。考虑到 BIOS 在加载操作系统时实际上是用的 INT 19h,Hello 程序二就利用挂钩19h 中断的方法抢在操作系统之前,BIOS 初始化之后运行,这样就可以完整地利用整个计算机系统的所有资源了。另外必须指出的是,模块本身有责任保持整个模块的校验和为零,也就是说,ISA 模块进驻内存中后就不能卸出,BIOS 会在模块返回后检查整个模块的检验和,判断模块的正确性,如果错误,则会死机。模块在初始运行时可以更改自己段内的数据,而在 BIOS 初始化完毕后,模块就不能再有改变自身数据的操作。;Hello 源程序二.model tiny.386code segmentassume cs:code,ds:codestart:signature db 55h,0aahcomlength db 01h ;文件长512字节jmp

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号