驻留程序设计论文

上传人:沈*** 文档编号:74445495 上传时间:2022-04-13 格式:DOC 页数:14 大小:104.52KB
收藏 版权申诉 举报 下载
驻留程序设计论文_第1页
第1页 / 共14页
驻留程序设计论文_第2页
第2页 / 共14页
驻留程序设计论文_第3页
第3页 / 共14页
资源描述:

《驻留程序设计论文》由会员分享,可在线阅读,更多相关《驻留程序设计论文(14页珍藏版)》请在装配图网上搜索。

1、驻留程序设计1.前言11.1驻留程序的特点21.2驻留程序的结构22. 驻留程序常用的驻留方法32.1中断驻留法32.1.1常驻程序基本结构32.2搬迁驻留法42.1.1收寻内存控制块法42.2.2内存空闲区搬迁法62.2.3高端地址搬迁法62.3驻留程序的撤消62.3.1利用DOS的INT49h功能调用来进行释放62.3.2修改内存控制块标志的释放方法72.3.3合并内存块法释放驻留程序72.4避免重复驻留72.5驻留程序的激活83 驻留程序的调试和激活83.1 TSR程序中的引导部分83.2 TSR程序中的驻留部分103.3 TSR的激活机制与方式123.4 防止TSR程序的重复驻留123

2、.5 TSR程序的调试124驻留程序设计要点135 参 考 文 献141.前言计算机软件操作系统应提供多任务环境,这对于当今的操作系统来说,几乎是不言而喻的,炙手可热的WINDOWS操作系统就是多进程环境的典范.但在DOS操作系统与WINDOWS操作系统并行不悖的今天,从运行速度、功能的灵活性考虑,仍有一些场合需要设计短小精悍且实用性强的DOS后台应用程序。驻留程序(TSR)就是这样一种应用程序。TSR(Terminate and Stay Resident)意为结束进程并驻留,它不同于结束即退出的一般DOS应用程序,而是把自身的一部分程序代码装入内存后将控制返回给DOS,这段程序代码一直潜伏

3、在“后台”工作,所占存储空间受到DOS保护而不会被其它程序覆盖.一旦激活TSR程序的条件满足(如执行了相应的热键操作),TSR将立即提供自身的服务功能.由此可见,TSR程序能够与前台程序并行工作且及时地处理一些事件,为单任务的DOS操作系统增添了多任务处理能力,优化了计算机环境,它是实用程序中最重要的一种类型,也是一种特殊的编程技术。驻留程序是一种重要的实用程序类型.掌握这种技术可以使程序员在单任务操作系统环境下,编写多任务程序。驻留程序具有很强的后台性能,与一般的程序不同,驻留程序一旦装载就一直存在且可以随时被激活调用。 驻留程序通过接管中断而工作,它们取代中断发生时调用的子程序,修改中断或

4、接管多个中断,以改变中断操作方式。驻留程序能发挥很大的作用,但同时也带来了许多的编程难点.编程不当会导致严重后果:堆栈溢出,屏幕混乱等.伴随着驻留程序的产生同时出现了一些与驻留有关的问题,如:驻留程序的释放,避免重复驻留等.妥善地处理好此类问题对于编写成功的驻留程序也是很重要的。1.1驻留程序的特点内存驻留程序是经运行后有一部分代码仍驻留在内存中的程序,它一般接管中断,即把用户自己编写的子程序替换或部分替换原有的中断服务子程序,同时修改中断向量使之指向用户编写的子程序。用户编写的子程序替换原有的中断服务程序后常驻内存,并可以在任何时候被激活。1.2驻留程序的结构内存驻留程序一般设计成COM文件

5、类型,从而它只有一个段,其基本结如下:跳转指令驻留部分非驻留部分由于非驻留部分位于程序的尾部,从程序的org 100h处安排一条跳转指令跳转到该部分.驻留部分包括驻留数据部分和驻留程序部分,驻留数据部分用于保存中间数据和原中断向量,驻留程序部分是用户设计的一个中断服务子程序,驻留程序部分应按下述原则设计:(1)它是一个FAR型的过程.(2) 若该程序还要调用原来的中断服务子程序,则用CALL指令调用,且调用之前一定要加一条PUSHF指令,与中断服务子程序的中断返回指令IRET相呼应。(3)用户编写的中断服务子程序必须以IRET指令返回.非驻留部分不在内存中驻留,其主要功能是保证驻留部分被装载,

6、它又分为检查。接管中断、驻留退出等三部分.检查部分的功能是检查是否已安装了内存驻留程序,一个内存驻留程序不应多次安装,因为每次安装,将会占用更多的内存。因此安装成功后,应设置某一标记,再次启动内存驻留程序时,就应检查该标记,如发现已经安装,则显示已安装提示信息,同时终止安装.一般借助于未用中断60h至67h中的某一个来设置标记.安装部分主要实现保存原中断向量,并把中断向量指向用户编写的驻留子程序.一般分别采用功能号为35h和25h的DOS调用实现.退出驻留部分的功能是终止程序的执行并驻留,在寄存器DX中设置合适的驻留长度,并调用功能号为31h的DOS调用。2. 驻留程序常用的驻留方法就现有的驻

7、留方法来说,可以分为中断驻留法和代码转移方法,即搬迁法。2.1中断驻留法2.1.1常驻程序基本结构(1) .com文件 常驻程序必须是.con,文件,程序只能加载在一个段内,其大小只能小于b4K字节。 程序分为三部分:第一部分定义了数据段和程序在程序中的位置,以及程序的开始地址;第二部分是可执行程序;第三部分是程序和段结束.注意程序执行是从地址l00h开始(2)内存常驻程序 用于程序驻留的中断有两种: a.使用INT27h结束中断并驻留:该中断主要用来终止当前程序的执行,但在内存中保留部分或全部代码,使之不被另一装人的程序覆盖。人口参数为: DX=要保留程序的最后一字节加1的位移(包括程序段前

8、缀) CS=程序段前缀 IN7Z7h能保留的最大数目为64K字节.由于执行INT 27h结果改变了INT22h ,IN723h , INT24h的向量,所以它不能用于永久安装用户写的严重错误处理程序。内存常驻程序与.com程序相比多了一部分,即第三部分,这部分使start和inin,之间的程序驻留在内存中。b使用INT21 h系统调用功能号31h,使程序驻留结束。入口参数:ah=31h al=返回代码DX=保留内存大小(1节数“16字节)该中断普遍用于驻留驱动程序或子程序,它在DOS命令级被调用一次后,随后以软中断方式提供服务.在调用前,应分配内存块的长度,程序装人时,它仅仅处理内存分配,该功

9、能优先于INT27h调用,因为它允许传送回一返回码,并有可驻留大于60K字节的程序。目前中断驻留法比较常用。2.2搬迁驻留法所谓搬迁法就是采取一定的方法,以获得内存中某一空闲区的起始地址及大小,之后再将需驻留的程序部分直接搬迁到该地址的空间里,同时采用某种手段使其不被其他再次装载的程序覆盖.用中断驻留法,使用者无需关心驻留程序所驻留的具体地址,也不必担心驻留部分会破坏系统。而使用搬迁法驻留,稍不注意就会导致系统瘫痪。此种方法又可以细分如下。2.1.1收寻内存控制块法(1)DOS管理内存是通过内存控制块来完成的,内存块包括两部分:内存控制块MC13;内存分配块MAIi。内存控制块的大小为1节(1

10、6字节),内存分配块的大小要根据具体程序来确定,其结构如下: 内存控制块MCB :16个字节,其具体内容见表1。 内存分配块MAIi:程序段前缀PSP(100h字节),内存装载程序部分。表1 (2)INT21h的52h一号保留中断功能IN721h的52h号中断功能调用主要是确定内存块主链中第一个内存控制块MCB的具体地址,根据第一个MCB的地址利用公式可计算出下一个MCB的具体地址,其调用格式如下: MOV AH, 52h INT 211r该操作的返回值为:E:S: (13X一2指向第一个MCI段地址,其偏移地址值为口.下一个MCB的具体地址的计算公式是:下一个内存控制块MCl3段地址二本内存

11、控制块地址+本内存分配块MAB大小+1(3)此种驻留方法的具体原理如下: 通过INT21 h一号的52h号子功能调用确定第一个MCB段地址,然后根据第一个MCB段地址分别计算出其他MCB段地址,在获得其他MCB段地址的过程中,分别查看该MCB的第O1和02位的值是否为0,为0则表示该内存块为空闲块,即可将需驻留部分直接移到该空闲块中,实现驻留。具体作法是:在查出_内存块为空闲块后,将本内存块的分配块的大小减去需驻留部分的大小,然后再将其差值放回到MCB的相应位中,之后再将需驻留的部分搬迁到原属于本内存块,而现在本MCB管理不着的空间中。2.2.2内存空闲区搬迁法 DOS系统中存在着许多间隙,有

12、的空隙还相当大,这些间隙为驻留程序提供了很大方便。可以将需要驻留的程序直接搬迁到该空闲区中,即可实现驻留,它既在DOS的正常管理之下,又不破坏DOS。此种间隙有很多,如:以ROM BIOS通讯区为例,其占用内存的40:00处,总共有256个字节,但是实际上IBM PC /XT仅使用到40:82h单元,最后122个字节未被使用,此种间隙中最大而又最完整的位于.50:00一50: 1 FF,这块内容,在分析中发现DOS系统只在该区建立了一个软盘基数表(IFH),除此之外,添人任何值,都不构成对DOS系统正常运行的威胁.但此种方法有一个缺陷,就是它只适用于小的驻留程序使用,且较易引发病毒.因此,从这

13、种角度来看它不是一种优秀的方法.2.2.3高端地址搬迁法DOS系统在004 :0013h处有一两字节的变量表示系统有多少可用的内存分配空间。可选用适当的方法将40 : 13字中的内容加以修改,从而减少DOS系统可分配空间,为驻留程序开辟一个足够大的空间.利用这种方法开辟的空间均在内存高端再通过一定的算法将内存高端地址算出,然后将需驻留部分搬迁到此处即可。计算内存高端地址的算法为:高端地址=(0413)一驻留程序大小)x6一07cOh2.3驻留程序的撤消 有许多TSR程序都没有释放的功能,这对于一些占用内存较多的ASR程序来说,会给用户带来很多不便,因此,对于一个驻留程序来说,在发挥其作用之后最

14、好采用一定手段将其释放.对于驻留程序的释放,可以采用三种方法:2.3.1利用DOS的INT49h功能调用来进行释放该种方法主要是用来释放那些通过对内存块操作而被驻留的程序,如上述收寻内存控制块法。具体做法是:在程序驻留时,首先要设置驻留标志,并保存原内存块大小,在释放时,就可通过收寻该标志的方法找到被驻留程序所在的内存块,再算出其所在内存块的起始地址,并根据内存块的大小采用INT49h加以释放。2.3.2修改内存控制块标志的释放方法这种方法是在驻留时首先将原内存块的一大小保存起来,并设置驻留标志。在释放时,根据驻留标志,寻找符合条件的块。找到之后,将该块的MCB的第01和02位送人0值,即将该

15、块标志成空闲块,并将保存的原内存块的大小重新赋给MCB的第03和04位,这样当再有程序加载内存时,此驻留程序就完全可以覆盖掉,进而实现了驻留程序的释放。2.3.3合并内存块法释放驻留程序系统加载执行一个程序时DUS至少给程序分配两个内存块,一个是包含环境的内存块,另一个是以PSP开头的内存块,包含有程序本身所有的代码和数据.而此种方法主要是通过对驻留程序的环境块和本身所在的内存块进行操作来实现的,即:在实现驻留时,首先保存当前程序的PSP段,然后根据PSP中2ch字节处的值获得程序的环境块的段值,再根据内存控制块中相应位的值将两个内存块的大小分别保存起来,在进行释放时,首先从相应变量中取出PS

16、P的段值,再根据PSP中Zch处的值获得驻留程序的环境块的段值,之后将环境块的内存控制块的第。位标志修改成“Z即最后一块),再从相应变量中取出保存的环境块大小和程序所在内存块的大小,将它们的和加1再赋给本环境块中内存控制块的第03位和04位,从而构成一个大的内存块,这样当再有程序加载内存时就完全可以把驻留程序覆盖掉,驻留程序部分也就被释放。2.4避免重复驻留TSR程序与一般程序不同,一般程序加载到内存,程序结束后,就会释放所占用的内存而TSR程序在结束之后,并不将内存释放,而是继续占用,如果多次重复驻留的话,就会使内存空间越来越小,甚至会破坏整个系统的运行,因此有必要避免重复驻留.现有的避免重

17、复驻留的方法有很多,如:内存搜索法,中断查询法等而这里采用的是一种在内存中某一空闲区的特定位上设置标志的方法,也就是在执行驻留程序时,先判断该空间中有无某特定的驻留标志有则返回DOS,没有则在该空闲区设定其标志并驻留。2.5驻留程序的激活 所有TSR程序都有其激活条件一般来说激活祖序的方法有很多,如:截时钟中断,热键等.这里采用的是一种组合键的方式,其主要方法是:先截取键盘中断09h,之后在新的09h中断中,先调用原09h中断,接着再调用键盘中断16h,利用返回值中的扫描码或ASC:II码来设置条件并判断是否满足要求。3 驻留程序的调试和激活下面我用汇编语言编写了一个TSR程序,其功能为如无键

18、盘工作则定时关闭屏幕显示功能,而一旦有任意键按下则恢复显示。在DOS环境下运行这个程序可达到屏幕保护的功能。以下通过这个程序实例介绍TSR程序的结构及设计。3.1 TSR程序中的引导部分这个TSR程序的主体部分由两部分组成:一部分是引导子过程save,它引导另一部分程序的驻留.为了使某程序段驻留内存并有一个运行的切入口,它要在中断向量表中以新中断服务程序入口地址替代原中断服务程序的入口地址。save: 子过程程序如下:save proc farmov ax,3509hint 21hlea dx,new09cmp dx,bxjz no-staymov word ptr oldint09,bxmo

19、v word ptr oldint09+2,esmov ax,351chint 21hmov word ptr oldintlc,bxmov word ptr oldint1c+2,esmov ax,csmov ds,axmov ax,2509hlea dx,new09int 21hmov ax,251chlea dx,new1cint 21hlea dx,msg1mov ah,09hint 21hlea dx,saveadd dx,0fhmov c1,04hshr dx,c1inc dxmov ax,3100hint 21hno-stay:lea dx,msg2mov ah,9int 21h

20、mov ah,4chint 21hsave endp 为了使TSR程序中的驻留代码驻留内存,该引导程序调用31H功能号将驻留部分占用内存空间的大小通知给DOS,DOS依此给驻留部分开辟一片内存空间,随即释放引导部分所占用的存储空间,这时引导部分就完成了自己的历史使命。这就是TSR程序的驻留过程.引导驻留主要有两种方式: 调用DOS中断的31H号功能。该功能是结束进程并将常驻部分驻留内存,驻留部分的大小由DX寄存器所指示。本文程序在调用31H功能号之前,计算驻留代码的存储空间大小,并以节(1节为16字节)为长度单位送入DX寄存器.从DX寄存器的数据表示范围来看驻留程序的规模最大可达到16216字

21、节长,足以满足无论是.com格式或.exe格式的TSR文件驻留. 调用INT 27H中断。INT 27H的功能也是结束进程且将常驻部分驻留内存,但调用时DX寄存器中的驻留长度表示单位为字节,显然,它限制了可驻留程序的最大规模为216即64k字节,即不超过一个段的长度。3.2 TSR程序中的驻留部分这个TSR程序的另一部分是new09和new10子过程,它们是被驻留程序段,具体完成定时关闭屏幕功能和键盘开启屏幕功能。它们截取了原键盘中断服务程序和原定时计数中断服务程序的入口,将其新功能段各自嵌入到原中断服务程序的头部,即执行了新增功能段后仍然转向原中断服务程序。这一部分代码常驻内存,所谓内存驻留

22、程序TSR指的就是这一段代码。new09和new10子过程如下:new09 proc farstipush axpush bxcmp cs:flag,0je old09mov bl,36hmov ax, 1200hint 10hmov cs:flag,0old09: mov cs:count,0pop bxpop axjmp cs:oldint09new09 endpnew1c proc farsti push ax push bx inc cs:count mov ax,cs:time cmp ax,cs:count jne old1c mov bl,36h mov ax,1201h int

23、 10h mov cs:count,0 mov cs:flag,0fh old1c: pop bx pop ax jmp cs:oldint1c new1c endp以上两个部分是程序的主体部分.TSR程序的框架如下: code segmentassume cs:code,ds:code,es:codeorg 100hgo: jmp savetime dw 500 ;该数据可调整以控制等待时间count dw 00flag db 00oldint09 dd ?oldint1c dd ?.msg1 db 0ah,0dh,Close CRT residented! ,0ah,0dh,msg2 db

24、 07h,0ah,0dh,bye! ,0ah,0dh,code endsend go3.3 TSR的激活机制与方式由于DOS是一个单任务操作系统,没有进程调度能力,因此潜伏在后台的TSR程序只有挂靠在某类中断上才能得到激活。本程序中的new09段挂靠在09号中断上,new10段挂靠在10H号中断上。为了激活TSR程序,在TSR程序初始化时,调用25H功能号修改中断向量,“偷梁换柱”地把驻留模块入口挂靠在某中断上.若驻留模块还需完整地使用原中断模块功能,就应调用35H功能号将原模块入口地址保存在约定的内存单元中,以便在需要的时候转移到原模块。值得指出的是至于原中断服务模块的入口地址是否要保留,这

25、要视具体情况而定,如果原中断服务模块完全弃之不用,则不必保留原模块入口地址.激活TSR有如下几种方式: 可沿袭某些原中断服务模块所具备的硬件中断“弹出”方式(如本文程序); 可以由外部事件启动,通常是定义热键,如定义某特定键或组合键以激活TSR程序; 修改某类中断服务程序,嵌入对内部事件的“监控”功能程序段,一旦被监控的事件发生,则激活TSR程序作相应的处理。3.4 防止TSR程序的重复驻留若不采取相应措施,TSR程序会每运行一次就驻留内存一次,这不仅没有必要,更会大量耗费内存及栈空间的资源,中断链的加长也会降低运行速度。本程序采用的措施是比较当前中断向量与TSR中断服务程序入口,若相同则表明

26、TSR程序已驻留,不再重复驻留.一般情况下,这是一个非常简单实用的方法。但这种方法不适用于多个不同的TSR程序依次驻留且又都修改了同一类中断向量的情况,因为再运行首次驻留的TSR程序,仍会由于比较结果的相异而发生重复驻留。全面的判断可使用DOS调用中的52H功能号取系统参数表,沿内存块链逐个检查是否具备该TSR程序的特征标志,若查到则不再重复驻留。3.5 TSR程序的调试TSR程序的调试有别于普通程序,因为TSR程序的两部分即引导部分和驻留部分均要被调试,而当它运行时仅仅执行的是引导部分的功能,这部分程序完成了引导驻留之后就结束了进程,因此,无法调试驻留部分.在这里介绍驻留部分的调试方法.首先

27、推荐调试工具软件Turbo Debugger,这是一个集成环境的源级调试器,它可以象调试一般的可执行文件那样调试驻留程序.利用Turbo Debugger调试驻留程序的步骤如下: 以TASM工具汇编TSR程序的.asm源程序文件,使用/zi参数指明加入符号调试; 以TLINK工具连接TSR程序的.obj文件,用/v参数指明包含调试信息; 若是以.com格式编写的TSR程序,则以exe2bin工具软件将TSR程序的.exe文件转换成.com文件; 运行Turbo Debugger,载入TSR程序并在TSR程序驻留部分的起点以及其它的必要处设置断点; 以常规方式调试引导部分,运行调试完毕这一部分后

28、,驻留部分已进入内存常驻; 选择FileResident选项,将Turbo Debugger自己驻留内存,使用户暂时脱离Turbo Debugger环境而回到DOS; 按热键或以约定的形式激活TSR程序的驻留部分,则每运行到驻留部分的断点处,Turbo Debugger集成环境将被弹回并显示当前驻留程序的运行现场供调试;再运行,再停留在断点现场供查看调试,直至调试完毕。掌握TSR程序的调试方法非常重要,因为若不具备动态调试TSR程序的手段,仅凭在程序清单上静态查错或在TSR程序运行时的“黑屏”前猜测出错原因,这是不可想象的低效率.本文程序以.com文件的格式编写,经TASM2.0版本汇编程序汇

29、编、TLINK3.0版本连接程序连接、再经exe2bin文件转换成.com文件,在DOS 5.0以上环境下运行通过。4驻留程序设计要点把程序编成COM型文件。程序的第一条指令为跳转指令,然后顺序编写驻留部分和非驻留部分。编写正确的中断服务子程序,且以iret指令返回。用户编写的中断服务子程序若要调用原来的中断,则用CALL指令调用,且调用之前务必加一条PUSHF指令。非驻留部分应检查是否已安装,以免多次安装浪费内存。安装部分包括保存原中断向量,置新的中断向量。退出部分的功能是终止并驻留,其驻留空间的长度应选择合适。5 参 考 文 献1 夏东涛.MS-DOS高水平程序设计.北京:电子工业出版社,1989.2663062 张鸿载.DOS高级技术分析.北京:国防工业出版社,19883Robert Jourdain.IBM-PC编程指南M.电子工业出版社,1988.4 刘德贵,杨宝琪.DOS/BIOS使用详解M.电子工业出版社,1992. 5 陈勇孝,孟树锁编、计算机病毒解析及诊治.19936 宋立波.解决TSR程序一次性驻留内存的根本方法.电子与电脑,1993,1047 熊桂喜等译.未公开的IBS核心技术.1993

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!