Кіріспе
Терминалдан шығу және тұрақты резиденттік бағдарлама (әдетте TSR) – DOS жүйесінде жұмыс істейтін, жүйелік шақыру арқылы бақылауды DOS-қа қайтаратын, бірақ аяқталғандай көрініп, компьютер жадында қалатын компьютерлік бағдарлама. Бұл, оны кейіннен қайта қосуға мүмкіндік береді. Бұл техника DOS-тың бір уақытта тек бір бағдарламаны немесе міндетті орындау шектеуін ішінара жеңілдетті. TSR тек DOS-та қолданылады, Windows-та емес. Кейбір TSR-лер – компьютер пайдаланушысы басқа бағдарламада жұмыс істеп жатқанда, ыстық перне арқылы күніне бірнеше рет шақыра алатын қосымша бағдарламалық құралдар. Borland Sidekick – осы типтің ерте және танымал мысалы. Ал басқалары операциялық жүйе тікелей қолдамайтын аппараттық құрылғылар үшін драйверлер ретінде қызмет етеді.
Қолдану
Әдетте DOS бір мезгілде тек бір бағдарламаны іске қоса алады. Бағдарлама аяқталған кезде ол DOS API-нің жүйелік шақыруын пайдаланып, DOS-қа басқаруды қайтарады. Пайдаланылған жад және жүйелік ресурстар бос деп белгіленеді. Бұл бағдарламаның бөліктерін толығымен қайта жүктеместен қайта іске қосуды мүмкін емес етеді. Дегенмен, егер бағдарлама жүйелік шақыру арқылы немесе , опералық жүйе оның жадының белгілі бір бөлігін қайта пайдаланбайды. Алғашқы шақыру «терминалдау, бірақ резиденттік сақтау» деп аталады, сондықтан «TSR» атауы. Осы шақыруды пайдаланып, бағдарлама 64 КБ-қа дейін жадын резиденттік ете алады. MS DOS 2.0 нұсқасы осы шектеуді жойған және бағдарламаға шығу кодын қайтаруға мүмкіндік беретін жақсартылған шақыруды («Процесті сақтау») енгізді. Бұл шақыруды жасамас бұрын, бағдарлама бір немесе бірнеше үзіліс иегерлерін орната алады, олар қайта шақырылуы мүмкін. Аппараттық үзіліс векторын орнату мұндай бағдарламаның аппараттық оқиғаларға жауап беруіне мүмкіндік береді. Бағдарламалық үзіліс векторын орнату оны қазіргі уақытта іске қосылып жатқан бағдарламамен шақыруға мүмкіндік береді. Таймерлік үзіліс иегерін орнату TSR-ді мерзімді түрде іске қосуға мүмкіндік береді (ISA және бағдарламаланатын интервалдық таймерді, әсіресе «IBM PC-мен үйлесімді» бөлімін қараңыз). Үзіліс векторын пайдалану әдісі оның қазіргі мәнін (адресті) оқуды, оны TSR-дің жад кеңістігінде сақтауды және оны өзінің кодындағы мекенжаймен алмастыруды қамтиды. Сақталған мекенжай TSR-ден шақырылады, нәтижесінде үзіліс иегерлерінің тізбегі құрылады, сондай-ақ үзіліс қызметтік процедуралары немесе ISR дейді. ISR-ді орнату процедурасы үзілісті тізбектеу немесе үзіліс векторын бұғаттау деп аталады. Үзіліс векторларын тізбектеу арқылы TSR компьютерді толық бақылауға ала алады. TSR екі түрлі мінез-құлықты көрсетуі мүмкін: Бұрынғыда сол үзіліс векторын өзгертетін басқа TSR-ді шақырмау арқылы үзілісті толық бақылауға алу. Ескі үзіліс векторына шақыру арқылы басқа TSR-мен каскадтасу. Бұл олардың нақты кодын орындағаннан бұрын немесе кейін орындалуы мүмкін. Осылайша TSR-лер тізбек құрады, әрқайсысы келесісіне шақыру жасайды. Терминалдау және резиденттік сақтау әдісін көптеген DOS вирустары және басқа да зиянды бағдарламалар қолданады, олар ПК-ны бақылауға алуы немесе фондық режимде жұмыс істеуі мүмкін. Бұл зиянды бағдарламалар дискіге кіріп-шығу немесе орындалу оқиғаларына жауап ретінде орындалатын (.EXE немесе COM) файлдарды жұқтырады және олар ашылғанда деректер файлдарын бұзады. TSR кез келген уақытта жүктелуі мүмкін: DOS жүктелу тізбегі кезінде (мысалы, AUTOEXEC.BAT-тан) немесе пайдаланушының сұрауы бойынша (мысалы, Borland-тың Sidekick және Turbo Debugger, Quicken-нің QuickPay немесе FunStuff Software-тің Жеке күнтізбесі). DOS-тың өзінің кейбір бөліктері осы техниканы қолданады, әсіресе DOS 5.0 және одан кейінгі нұсқаларында. Мысалы, DOSKEY командалық жол редакторы және басқа да түрлі утилиталар құрылғы драйверлері ретінде CONFIG.SYS-тағы DEVICE операторлары арқылы емес, командалық жолдан (қолмен немесе AUTOEXEC.BAT-тан немесе CONFIG.SYS-тағы INSTALL арқылы) іске қосылып орнатылады. Кейбір TSR-лерді өздігінен жою мүмкін болмайды, сондықтан олар қайта жүктеуге дейін жадыда қалады. Дегенмен, MARK.EXE/RELEASE.EXE комбинациясы сияқты құралдарды пайдаланып, оларды сырттан жоюға болады немесе TSR-ді қайта жүктеуге болады, ол белгілі бір пернелер комбинациясын ұстап, содан кейін жүктелген барлық TSR-лерді босатады. ISR тізбегі жеке тізбектелген болғандықтан және TSR өзінің алдыңғысына сілтемені қалаған жеріне сақтай алатындықтан, TSR-ді тізбектен жоюдың жалпы жолы жоқ. Сондықтан әдетте TSR-ді жою кезінде жадыда қалдық қалдырылуы керек, бұл жадтың фрагментациясына әкеледі. Бұл мәселе TesSeRact және AMIS сияқты TSR ынтымақтастық шеңберлерін тудырды.
Take complete control of an interrupt by not calling other TSRs that had previously altered the same interrupt vector. Cascade with other TSRs by calling the old interrupt vector. This can be done before or after they executed their actual code. This way TSRs can form a chain where each calls the next. The terminate and stay resident method is used by most DOS viruses and other malware, which can either take control of the PC or stay in the background. This malware will react to disk I/O or execution events by infecting executable (. EXE or COM) files when it is run and data files when they are opened. TSRs can be loaded at any time; either during the DOS startup sequence (for example, from AUTOEXEC. BAT), or at the user's request (for example, Borland's Sidekick and Turbo Debugger, Quicken's QuickPay, or FunStuff Software's Personal Calendar). Parts of DOS itself use this technique, especially in DOS versions 5.0 and later. For example, the DOSKEY command line editor and various other utilities are installed by running them at the command line (manually, or from AUTOEXEC. BAT or through INSTALL from within CONFIG. SYS) rather than loading them as device drivers through DEVICE statements in CONFIG. SYS. Some TSRs have no way to unload themselves, so they will remain in memory until a reboot. However unloading is possible externally, using utilities like the MARK. EXE/RELEASE. EXE combo by TurboPower Software or soft reboot TSRs which will catch a specific key combination and release all TSRs loaded after them. As the chain of ISRs is singly linked, and a TSR may store the link to its predecessor anywhere it chooses, there is no general way for a TSR to remove itself from the chain. So usually a stub must be left in memory when unloading a TSR, causing memory fragmentation. This problem gave rise to TSR cooperation frameworks such as TesSeRact and AMIS.
Ортақ пайдалануды тоқтату
Бірдей үзілісті бөлісетін көптеген TSR-мен туындаған мәселелерді шешу үшін Ralf D. Brown INT 2Fh арқылы ұсынылған бұрынғы қызметтерге қарағанда жақсарту ретінде Alternate Multiplex Interrupt Specification (AMIS) әдісін ұсынды. AMIS бағдарламалық үзілістерді бақыланатын түрде бөлісуге мүмкіндік береді. Ол бастапқыда x86 процессорының аппараттық үзілістерін бөлісу үшін IBM компаниясы жасаған Interrupt Sharing Protocol-інен үлгі алды. AMIS қызметтері Int 2Dh арқылы қолжетімді. Алайда, бұл ұсыныс сол кезде бағдарламашылардың арасында кеңінен қолдануға ие болған жоқ. Ол басқа да бірнеше бәсекелес сипаттамалармен бірге пайда болды, олардың күрделілігі әртүрлі болды.
Қателіктер
DOS-тың шектеулерін жеңу үшін өте пайдалы, тіпті қажетті болса да, TSR-лер проблема тудырушылар ретінде танымал. Көптегендер операциялық жүйені әртүрлі, құжатталған немесе құжатталмаған жолдармен иеленеді, көбінесе белгілі бір қосымшалармен немесе басқа TSR-лермен қолданғанда олардың қосылуы немесе ажыратылуы кезінде жүйелердің құлауына себеп болады. Жоғарыда айтылғандай, кейбір вирустар мен басқа да қауіпті бағдарламалар TSR ретінде жазылған және қасақана проблема тудырады. Сонымен қатар, DOS-тағы барлық бағдарламалар, тіпті үлкен көлемдегі физикалық жады барлар да, RAM-ның алғашқы 640 КБ-на (қолдану жадына) жүктелуі тиіс. TSR-лер де осы талаптан тыс қалмайды және басқа қолданбаларға қолжетімсіз 640 КБ-тан бөліктерді алып қояды. Бұл TSR-ді жазуды мүмкіндігінше кішкентай өлшемге жеткізу және оның әртүрлі өндірушілердің көптеген бағдарламалық өнімдерімен үйлесімділігін тексеруді қиын міндетке айналдырды – көбінесе өте көнерген жұмысқа. 1980-жылдардың соңы мен 1990-жылдардың басында PC платформасындағы көптеген бейне ойындар осы шекке дейін жетіп, TSR үшін аз ғана орын қалдырды – тіпті CD-ROM драйверлері сияқты маңыздылары да. Ойындарды іске қосу үшін жеткілікті RAM-ды ұйымдастыру және қажетті TSR-лерді сақтап тұру – қиын өнерге айналды. Көптеген ойыншылар әртүрлі ойындар үшін әртүрлі конфигурациялармен бірнеше жүктеу дискілеріне ие болды. MS DOS-тың кейінгі нұсқаларында "жүктеу мәзірі" сценарийлері әртүрлі конфигурацияларды бір мәзірден таңдауға мүмкіндік берді. 1990-жылдардың ортасынан соңына дейін көптеген ойындар әлі де DOS үшін жазылған кезде, 640 КБ шегі ойын деректерінің бөліктерін бірінші 1 МБ-тан жоғары орналастыру арқылы еңсерілді және кеңейтілген жадды пайдалану арқылы кеңейтілген жадқа қол жеткізу үшін 640 КБ-тан төмен кодты қолдану арқылы еңсерілді. Баламалы тәсіл – DOS кеңейтушілерін пайдалану арқылы процессорды қорғалған режимге ауыстыру және бағдарламаны қорғалған режимде іске қосу. Соңғысы кеңейтілген жад аймағында код пен деректерді сақтауға мүмкіндік берді. Көптеген жапсырмалармен бағдарламалау өзі қиындық тудыратындықтан, бағдарлама шамамен 512 КБ-қа толығымен сыймағанда, кеңейтілген жадты пайдалану көбінесе VCPI немесе DPMI-ді жүзеге асыратын үшінші тарап DOS кеңейтушісін пайдалану арқылы жасалатын, өйткені 1 МБ-тан жоғары жадқа қол жеткізу әлдеқайда оңай және жылдам болды және x86 процессоры нақты режимнен қорғалған режимге ауысқанда сол аймақта кодты іске қосу мүмкін болды. Алайда, DOS және көптеген DOS бағдарламалары нақты режимде жұмыс істейді (VCPI немесе DPMI қорғалған режимдегі бағдарламаны DOS-қа және жүйенің қалған бөлігіне екі режим арасында ауысып, нақты режимдегі бағдарлама сияқты көрінеді), сондықтан DOS TSR және құрылғы драйверлері де нақты режимде жұмыс істейді. Сондықтан, кез келген уақытта біреу бақылауға ие болғанда, DOS кеңейтуші бақылауды қайтаруға дейін уақытты жоғалтуға ұшырайды (егер олар DPMS немесе CLOAKING сияқты техникаларды қолданбаса).
Қайту
1980-ші жылдардың екінші жартысында кеңейтілген жад тақталарының және әсіресе Intel 80386 процессорларының пайда болуымен TSR-лерді жүктеу үшін 640 КБ-тан астам жадты пайдалану мүмкін болды. Бұл үшін кеңейтілген жад менеджерлері деп аталатын күрделі бағдарламалық шешімдер қажет болды. Кейбір жад менеджерлері – Quarterdeck компаниясының QRAM және QEMM, Qualitas компаниясының 386MAX, Compaq компаниясының CEMM және кейіннен Microsoft компаниясының EMM386. 640 КБ-тан жоғары TSR-лерді жүктеуге қолданылатын жад аймақтары "жоғарғы жад блоктары" (UMB) деп аталады, ал оларға бағдарламаларды жүктеу "жоғары жүктеу" деп аталады. Кейіннен жад менеджерлері Quarterdeck-тің Optimize немесе Microsoft-тың MEMMAKER сияқты бағдарламаларды қоса бастады, олар TSR-лерді төменгі және жоғарғы жад арасында қалай бөлу керектігін анықтап, алғашқы 640 КБ-тағы қолжетімді кеңістікті барынша арттыруға тырысады.
Құлдырау
DOS кеңейтушілерін қолданатын ойындардың (Doom мысалы) дамуымен 640 КБ шегінен асып түсуге мүмкіндік болды, көптеген TSR-ге қатысты мәселелер жойылды. Microsoft Windows, әсіресе Windows 95 (кейін Windows 98) кеңінен қолданылғанда, көптеген TSR қажетсіз болып, ал кейбіреулері үйлесімсіздік тудырды. Windows рұқсат бергендіктен, Win16 қолданбалары үзіліс сипаттамалық кестесін (IDT) түзету сияқты TSR-ге ұқсас амалдар жасауға болатын. Windows Me Windows Me-ді өшіру арқылы DOS ядросына жүктеуге мүмкіндік бермейді, сондықтан TSR-лер Windows Me үшін ешқандай пайдалы болмады. Windows NT сериясы (Windows 2000, Windows XP және одан кейінгілерді қоса алғанда) DOS-ты толықтай алмастырды және әрқашан қорғалған немесе ұзақ режимде (кейінірек 64 биттік нұсқаларда ғана) жұмыс істеді, TSR-лердің жұмыс істеуі үшін қажетті нақты режимге ауысу мүмкіндігін жойды. Оның орнына, бұл операциялық жүйелерде жадты қорғау және алдын ала көп тапсырмалылықпен жаңа драйверлер мен қызметтер аясы бар, бұл бірнеше бағдарламалар мен құрылғы драйверлерін ешқандай арнайы бағдарламалау амалдарына жүгінбестен бір уақытта іске қосуға мүмкіндік береді; ядро мен оның модульдері үзіліс кестесін өзгертуге толық жауапкершілікті алды.