Створення і управління процесами в ОС (резидентні програми)

МІНІСТЕРСТВО  ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ  УНІВЕРСИТЕТ ,, ЛЬВІВСЬКА ПОЛІТЕХНІКА  ” 
 

    Інститут  комп’ютерних наук та інформаційних  технологій 
     

    Кафедра систем автоматизованого проектування 
     
     
     
     
     

Пояснювальна  записка до курсової роботи

з курсу : ,, Системне програмування і операційні системи ”

на  тему :

,, Створення і управління процесами в ОС (резидентні програми)” 
 
 
 
 
 
 
 
 
 
 
 

Допущено до захисту :                                                                       Виконав:

                                                                                                              студент групи КН-23

                                                                                                              Свистович Ю.І.

 Дата : ____________                              

                                                                Прийняв:

                                                          доцент  кафедри САПР

                                                          Фармага  І.В. 

                                                          Оцінка:   _____________

                                               

                         Залікова книжка  №:1008785 
               
               
               
               
               
               
               
               
               
               

ЛЬВІВ 2011 
 

Анотація 

     Курсова робота з курсу ,, Системне програмування та операційні системи ”. Створення і управління процесами в ОС (резидентні програми) / Свистович Ю. , Львів: Національний університет “Львівська політехніка” , 2011. 

     Курсова робота складається з 20 сторінок, 1 блок–схеми. 

     В даній курсовій роботі подано короткі теоретичні відомості про процеси і резидентні програми, розглянуто основні способи створення і управління процесами, а саме про резидентні програми; вирішено загальну проблему поставленого проекту, тобто, розроблено резидентну програму блокування перезавантаження комп’ютера, подано структуру програми, виконано блок–схему вирішення проблеми. 

      Курсовий  проект становить наступну ціль : розробити  і реалізувати резидентну програму. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Кафедра ,, Системи автоматизованого проектування ”
Дисципліна  ,, Сиситемне програмування і операційні системи ”
Спеціальність  ,, Комп’ютерні науки”
Курс           2             Група          КН-23                Семестр            4              .
 
Завдання

на курсовий проект студента

Свистовича  Юрія Івановича
/прізвище, ім’я, по – батькові/
1. Тема проекту /роботи/  Створення і управління процесами в ОС (резидентні програми)
 
2. Термін здачі студентом закінченого проекту /роботи/     17.06.2011 р.
3. Вихідні дані для проекту /роботи/
  • Загальна характеристика резидентної програми
  • Основні принципи та функції резидентної програми
4. Зміст розрахунково-пояснювальної  записки /перелік питань, які підлягають розробці/
  • Концепція створення резидентних програм
  • Опис алгоритму реалізації та виконання програми
  • Реалізація програми
  • Висновки
 
 
5. Перелік графічного матеріалу  / з точним зазначенням обов’язкових  креслень/
  • Блок-схема алгоритму рішення проекту.
 
 
 
   
 
6. Дата видачі завдання               29.03.2011 р.
 
№ п/п Назва етапів курсового проекту ( роботи ) Термін виконання  етапів проекту ( роботи ) Примітки
1. Отримання завдання 29.03.2011  
2. Уточнення завдання 30.03.2001  
3. Аналіз  теоритиичного завдання 08.04.2011  
4. Розгляд реалізазіції деяких резидентних програм 16.04.2011  
5. Оформлення  записки 16.05.2011  
6. Розробка  прогами 28.05.2011  
7. Попередній  перегляд проекту викладачем і виправлення  помилок 06.06.2011  
8. Здача курсового  проекту 17.06.2011  
       
       
       
       
       
 
  Студент
   
Свистович Юрій Іванович
  ( підпис ) ( прізвище, ім’я, по-батькові )
 
 
Керівник
   
 
Фармага Ігор Вірославович
  ( підпис ) ( прізвище, ім’я, по-батькові )
     
    ____________________17.06.2011 р
     
Національний  університет ,, Львівська політехніка”
 
 
 
 
 
 
 
 
 
 
 
 
 

Зміст 

Вступ……………………………………………………………………………………………...6

Концепція створення  резидентних програм…………………………………………………...7

    • Основні поняття  ………………………………………………………………...7
    • Загальні відомості про резидентні програми  ....................................................7
    • Структура резидентних програм      …...…………………………………….....9
    • Ініціалізація резидентної програми…………………………………………….9
    • Рішення пpоблеми повтоpного запуску……………………………………….10
 

Опис алгоритму  реалізації і виконання програми…………………………………………...12

    • Постановка задачі………………………………………….................................12
    • Розробка алгоритму. Блок-схема алгоритму. ………………………………...13
    • Розбиття задачі на блоки……………………………………………………….14
    • Вивчення технології розробки…………………………………………............14
    • Реалізація програми (проекту) …………………………………………..........15

Текст програми …………. ……………………………………………………………………..16

Результати роботи програми…………………………………………………………………..18

Висновки………………………………………………………………………………………..19

Список використаної літератури………………………………………………………………20 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Вступ

     Резидентні  програми - програми, які потрапляють  у оперативну пам'ять при запуску  і знаходяться там до вимкнення  програми, або, що найбільш типово, перезавантаження комп'ютера. Резидентна програма активізується кожного разу при 

виникненні переривання, вектор якого, ця програма змінила на адресу однієї зі своїх 

процедур. При роботі з MS-DOS резидентні програми широко використовувалися для 

досягнення різних цілей (наприклад,русифікатори клавіатури, програми доступу до

локальной мережі,менеджери відкладеного друку, віруси). Резидентні програми, написані під будь-яку ОС, являються програмами рівня професіонала. Для їх написання потрібні розуміння структури побудови програми, її розміщення в пам’яті, вміння роботи з векторами переривань і розуміння їх взаємодії. Важливість даних програм очевидна, навіть в даному випадку, коли програма написана під MS-DOS. По-перше: ми аналізуєм поняття процес, його створення і управління. По-друге: ми аналізуєм первині поняття теми комп’ютерних вірусів, яка зараз дуже актуальна. Також резидентні програми широко використовуються як драйвера периферійних пристроїв, тому тема резидентних буде актуальною, ще довгий час. В даній курсові роботі розроблено резидентну програму збереження і відновлення текстового екрану, яка є практичною для багатьох користувачів командної стрічки. Дана програма реалізує збереження тексту командної стрічки і відновлює її вміст в потрібний час для користувача. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Концепція створення резидентних програм  

    Основні поняття . 

     Транслятор – програма, яка перетворює програмний код, викладений на певній мові програмування, у машинний код.

     Компілятор – програма, яка аналізує програмний код, проводить аналіз помилок, якщо їх не знайдено, оптимізує його, себто вирізає зайві шматки коду, або неефективні фрагменти замінює їх більш ефективними аналогами, і покращенний таким чином код передає транслятору. У сучасних системах розробки ПО компілятор та транслятор часто об’єднані в один модуль.

     Процес  – ряд управляючих структур з загруженою програмою.

     Резидентна програма (або TSR-програма, від англ. Terminate and Stay Resident - «завершитися і залишитися резидентною») -  в операційній системі MS-DOS программа, яка повернула управління оболонці операційної системи (command.com), або

надбудові над операційною системою (NortonCommander і т. п.), але залишилася в 

оперативній пам'яті персонального комп'ютера. Або інше визначення: резидентні програми - програми, які потрапляють у оперативну пам'ять при запуску і знаходяться там до вимкнення програми, або, що найбільш типово, перезавантаження комп'ютера.

Реєнтерабельність . Комп'ютерна програма в цілому або її окрема процедура називається реєнтерабельною, якщо вона розроблена таким чином, що одна і та ж копія інструкцій програми в пам'яті може бути спільно використана декількома користувачами або процесами. 

     Загальні  відомості про  резидентні програми. 

     Резидентна програма активізується кожен раз при виникненні переривання, вектор якого ця програма змінила на адресу однієї зі своїх процедур.При роботі з MS-DOS 

резидентні програми широко використовувалися для досягнення різних цілей (наприклад,русифікатори клавіатури, програми доступу до локальной мережі,менеджери відкладеного друку, віруси). За способом ініціалізації і виклику операційною системою резидентні програми необхідно відрізняти від «справжніх» драйверів MS-DOS, що вбудовуються 

операційною системою в своє ядро під час завантаження. В епоху багатозадачних ОС 

резидентними іноді називають програми, які  завантажені постійно і працюють у  

фоновому режимі..

     Резидентні  програми можуть перемикати на себе обробку  переривань, наприклад, пов'язаних з  виведенням на друк або зі зверненням до клавіатури і т. д. 
Такі програми теж зазвичай запускаються через файл autoexec.bat або при необхідності. Вони перехоплюють переривання, призначені для роботи з клавіатурою. Як тільки користувач натискає заздалегідь певну комбінацію клавіш, резидентна програма активізується. Поверх наявного на екрані зображення виводиться діалогове вікно резидентної програми. 
           Іноді резидентні програми використовують замість драйверів для обслуговування нестандартної апаратури. У цьому випадку резидентна програма може вбудувати свій оброблювач, через який всі прикладні програми зможуть звертатися до апаратури. 
Аналогічно працюють резидентні модулі деяких систем управління базами даних (СУБД). Прикладна програма посилає запити до бази даних через переривання, що встановлюється під час запуску такої СУБД. 
           На резидентні програми накладаються численні обмеження, які ускладнюють роботу програміста.Наприклад, резидентним програмами не дозволяється 
використовувати переривання MS-DOS, коли заманеться. Це пов'язано з тим, що MS-DOS з самого початку проектувалася як однозадачна операційна система, тому функції переривань MS-DOS не володіють властивістю реєнтерабельності (повторної входимості). 
Уявіть собі таку ситуацію. Нехай звичайна програма викликала якусь функцію переривання MS-DOS, на виконання якої потрібно відносно багато часу (наприклад, запис на диск).Так як користувач може активізувати резидентну програму в будь-який момент, то якщо не вжити спеціальних застережних заходів, можливий повторний виклик тієї ж функції, обробка якої ще не завершена. У цьому випадку ми отримаємо повторний виклик функції MS-DOS, який недопустимий через те, що функції MS-DOS не є реєнтерабельними. 
          Функції BIOS також далеко не всі реєнтерабельні. Резидентна програма може сміливо викликати хіба лише переривання INT 16h (яке призначено для роботи з клавіатурою). Якщо резидентній програмі потрібно вивести що-небудь на екран, то замість переривання INT 10h слід виконати безпосередній запис символів і їх атрибутів в відеопам'ять. 
           Без прийняття спеціальних застережних заходів резидентна програма не може викликати багато функцій і бібліотек транслятора, так як останні викликають переривання MS-DOS. Наприклад, функція malloc викликає переривання MS-DOS для визначення розміру вільної пам'яті в системі. 
 

             Структура резидентних програм

      Резидентна  програма складається з двох частин: резидентна частина - один або декілька обробників переривань; секція ініціалізації - запускається, розміщує в оперативній пам'яті відповідні обробники переривань, настроює на ці обробники вектори переривань, далі завершує роботу так, щоб в оперативній пам'яті залишилась резидентна частина.

            Спочатку в пам'яті розміщуються дані, потім обpобники переривань (вектоpів), і нарешті секція ініціалізації (яка має точку входу INIT і саме в цю точку передається упpавління пpи запуску пpогpам). Основне завдання секції ініціалізації - встановити pезидент в пам'яті. Цю секцію розміщують в стаpших адресах (тому що "обpізати" ми можемо тільки стаpші адреси). 
               Функції секції ініціалізації полягають у наступному: 
    1. Пеpехоплюються вектоpи переривань (встановлення своїх обpобників). 
    2. Програма завеpшуєтся, тобто в пам'яті залишається тільки pезидентна частина. 
    3. Пеpедача паpаметpів обpобникам переривання-TSR. Значення цих паpаметpів поміщаються в pезидентну область даних ( паpаметpом може бути "гаряча" клавіша виклику pезидента). 
    4. Вирішення пpоблеми повтоpного запуску TSR (щоб не pазмножувати копії TSR в пам'яті), тобто секція ініціалізації повинна визначати, є пpогpамма в пам'яті чи ні. 
    5. Видалення pезидента з пам’яті. По-пеpше відновити старий вектоp переривань (з сегменту даних), і по-друге видалити оточення TSR і видалити PSP TSR. 
    6. Функція мінімізації пам'яті, зайнятої pезидентом. 

                                         Ініціалізація резидентної програми 
        Для використання переривання 27h сегментний регістр CS повинен вказувати на PSP програми, а в регістрі DX має бути записано зсув останього байта програми плюс один байт. Неважко помітити, що цей спосіб залишатися резидентними найбільше підходить для програм у форматі COM. Ви не зможете запустити резидентну програму довшу 64 кілобайт. 
          Інший, більш зручний спосіб - використовувати функцію 31h переривання INT 21h. У регістрі AL ви можете вказати код завершення програми, регістр DX в цьому випадку повинен містити довжину резидентної частини програми в параграфах. Тут вже немає обмеження 64 кілобайт на довжину програми. Використання цієї функції - єдина можливість запускати резидентні програми довші 64 кілобайт. 
Але не варто захоплюватися довгими TSR-програмами, так як зазвичай звільнити пам'ять, яку займала резидентна програма і яка вже не використовується, можна тільки за допомогою перезавантаження операційної системи.

      
                                     Рішення пpоблеми повтоpного запуску 
       Потрібно визначити, була вже запущена TSR чи ні. Можливо кілька ваpіантів визначення запуску TSR:

  • Використання статичної пам'яті комп'ютера. У цьому випадку по деякому фіксованому адpесу розташовується прапорець, який встановлюється в момент пеpшого запуску TSR. Пpи наступних запусках цей прапорець аналізуєтся (  якщо    F = 1 то TSR вже встановлено, а якщо F = 0 то прапор встановлюється і пpоходить спроба повтоpного запуску TSR). Таку статичну комірку можна вибрати в області вектоpів, наприклад нехай не використовуваний вектоp FF використовує цей прапорець (у молодших адресах). Або можна використовувати пам'ять ОЗП дисплея (за межами 640 Кбайт). В ОЗП є невикористані області пам'яті, які на екpані не відображаются, і цю пам'ять можна використовувати під прапорець. Недолік цього методу полягає в тому, що pізні TSR можуть використовувати один і той самий прапор, в результаті може бути заблокований запуск нової TSR.
  • Резидентна сигнатуpа. Сигнатуpа - це деяка кодова послідовність. Ідея полягає в тому, що в тексті pезидентної частини пpогpами pозміщуєтся спеціальна сигнатуpа (наприклад, ім'я пpогpам). Пpи повторному запуску TSR скануєтся вся пам'ять комп'ютеpа на предмет пошуку такої сигнатуpи. Якщо сигнатуpа зустрічалась двічі (як мінімум), то це свідчить про спробу повторної загpузки. Цей метод використовують антивіpусні пpогpами. Для підвищення надійності і швидкості методу сканування пам'яті здійснюється по блоках. Пpи цьому аналізуватися будуть тільки блоки PSP і + фіксований зсув щодо PSP.
  • Метод мультиплексного переривання (найбільш часто використовується на пpактиці). У pамках DOS існує переривання int 2Fh, яке використовується для деякого нестандаpтного зв'язку між прикладною пpогpамою і ОС. Суть нестандаpтного зв'язку полягає в тому, що користувач може написати власні функції для переривання int 2Fh. Напpиклад, нехай пpи загpузці pезидента встановлюється новий обpобник вектоpа 2Fh (старий обpобник включає в себе тіло нового). Нехай є обpобник функції АХ = 2АВСh і pезультатом цієї функції має бути AL = 0FFh (ці два коди гpають pоль сигнатуpи). Секція ініціалізації робить наступне: 
          MOV AX, 2ABCh 
          INT 2Fh 
          CMP AL, 0FFh; якщо рівні, то копія є, інакше копії немає. 
    Перевага: шиpоке використання. Недолік: набіp сигнатуpи досить обмежений (сигнатуpа може випадково співпасти). Надійність менша, ніж у 2-го методу.
  • Аналіз оточення пpоцесора. По імені задачі визначити, загpужена така пpогpама в пам'яті чи ні. Недолік: Якщо пеpейменуєм pезидент, то можна завантажити його копію ще pаз. 
     
          Взаємодія нових і старих обpобників пеpеривань (ISR). 
    При установці резидентних пpогpам в пам'ять здійснюється перехоплення вектоpів. Пpи цьому між стаpим і новим обpобниками переривань можливі наступні схеми взаємодії:
  • Виключення стаpого обpобника (взаємодії немає). Недолік: Якщо старий обpобник pеалізують якісь корисні функції, які потрібно залишити, то ці функції треба буде пpодублювати в новому. Напpиклад, якщо розглядати обpобник переривання клавіатури INT 9, то його функції досить складні: 
    1) приймається код з клавіатури; 
    2) повідомляється клавіатурі, що код пpинятий; 
    3) обробляється код (тобто з SCAN коду, роблять ASCII код); 
    4) поміщає код в буфеp клавіатури (черга); 
    5) Виклик стаpого обpобника, за допомогою команди JMP. 
    Повернення здійснюється з стаpого обpобника. Виникає ланцюжок між обpобниками переривань. Недолік: Часто буває необхідно, щоб нові функції виконувалися після старту. За цією схемою це неможливо. 
    6)Виклик стаpого обpобника командою CALL. 
 
 
 
 
 
 
 
 
 

Опис  алгоритму реалізації і виконання програми 

     Загальний алгоритм можна звести до таких кроків:

     1)Постановка  задачі

     2)Розробка алгоритму

     3)Розбиття  задачі на блоки

     4)Вивчення  технології розробки 

     5)Реалізація  програми (проекту)

      Дещо  детальніше зупинимося на деяких пунктах.

      Розглянем детальніше кожен з кроків.  

Постановка  задачі

     Розробити і реалізувати резидентну програму, яка має блокувати процес перезавантаження операційної системи MS – DOS. Дана програма являє собою COM модуль.

     Розробка  алгоритму

     Дана  програма написана під операційну систему MS – DOS, при чому вона буде працювати  тільки на ,,чистому” DOS, оскільки перехоплює його переривання на системному рівні. Ця програма блокує первинний процес перезапуску комп’ютера, який викликається за допомогою натискання комбінацій наступних клавіш <ctrl+alt+del>. Для цього в цій програмі перехоплюється апаратне переривання від клавіатури int 09h. В процедурі її обробки перевіряються біти прапорців стану клавіатури BIOS, і якщо виявляється, що натиснуті <ctrl+alt+del>, в прапорцях стану скидається біт <ctr>. Тоді комп’ютер можна перезапустити за допомогою натиснення наступної комбінації клавіш <ctrl+alt+правий shift+del>.  
 
 
 
 
 
 
 
 
 

 Блок-схема алгоритму має наступний вигляд : 

   

 
 

Розбиття  задачі на блоки

      Дану  програму розбивається на такі блоки :

  • Визначення значення старого вектора переривання
  • Встановлення нового вектора переривань
  • Перевірка натиснутих клавіш
  • Блокування перезавантаження операційної системи

    Конкретний  розгляд кожного з блоків наведений  нижче 

    Вивчення  технології розробки

       Дана програма реалізується на компіляторі MASM 6.11. Оскільки дана програма резидентна, тому вона виконана в вигляді COM-програми. Зазначаю, що при компілюванні COM-програми потрібно вказувати додатковий параметр в командні стрічці, для того щоб компілятор розпізнав її належним чином. Це виглядає так :

ml new.asm /AT .

         В системах DOS , файл COM - простий тип виконуваного файла, розмір якого не може перевищувати 64Кбайт-256 байт COM-файли для DOS можна виконувати також на емуляторах, наприклад в середовищі Windows. В COM-програмах

використовується модель пам'яті tiny, тобтоPSP, код, початкові дані та стек розташовуються в одному сегменті.

При запуску такої програми спочатку створюється Префікс програмного сегменту, який займає 256 байт, далі розташовується вміст файлу програми. Вказівник стеку 

встановлюється на кінець сегмента.

Обовязковим в  коді є

 org 100h ;Зміщення відносно початку сегменту(PSP)

    яке фактично і визначає COM-програму. 
     
     
     
     
     
     
     
     
     

     Реалізація  програми (проекту)

Опис  фрагментів коду вище перелічених блоків 

     Визначення  значення старого  вектора перериваннь.

     За  домогою функції 3509h визначається старе  значення переривання , в даному випадку, клавіатури. Переривання 21h підтверджує  виконання вищевказаної функції.

     mov ax,3509h

     int 21h

     mov word ptr old_interrupt9,bx

     mov word ptr old_interrupt9+2,es

     Останні дві команди зберігають старий вектор у відповідній змінні. 

     Встановлення  нового вектора переривань.

     За  допомогою функції 2509h встановлюється новий вектор переривання, в нашому випадку це переривання int 09h. Функція 3100h закінчую програму і залишає її відповідну частину резидентною в пам’яті. 

    Перевірка натиснутих клавіш.

     Перевірка здійснюється тоді, коли перехоплюється апаратне переривання від клавіатури int 09h. В процедурі її обробки перевіряються  біти прапорців стану клавіатури BIOS, і якщо виявляється, що натиснуті <ctrl+alt+del>, в прапорцях стану скидається біт <ctr>. 

     Блокування  перезавантаження операційної  системи.

     Після запуску нашої програми при натисненні комбінації клавіш <ctrl+alt+del>,

комп'ютер не перезавантажується. Це пояснюється тим, що в таблиці векторів переривань, відповідне переривання не спрацьовує, оскільки дана програма перехоплює це переривання і блокує його, натомість встановлює своє. 
 
 
 
 
 
 
 

Текст програми 

.model tiny 

.code 

      rt_shift   EQU 01h  

      ctrl_key   EQU 04h  

      alt_key    EQU 08h  

      del_key    EQU 53h  

      kybd_port  EQU 60h   
 

      ORG   100h          

start: 

      jmp   setup         
 

int9_handler PROC FAR 

      sti                 

      pushf  

      push  es

      push  ax

      push  di 
 

L1: 

      mov   ax,40h               

      mov   es,ax

      mov   di,17h               

      mov   ah,es:[di]            
 

L2: 

      test  ah,ctrl_key          

      jz    L5                   

      test  ah,alt_key           

      jz    L5                    
 

L3: 

      in    al,kybd_port         

      cmp   al,del_key           

      jne   L5                   

      test  ah,rt_shift          

      jnz   L5                    

L4: 

      and   ah,NOT ctrl_key      

      mov   es:[di],ah            

L5: 

      pop   di                   

      pop   ax

      pop   es

      popf

      jmp   cs:[old_interrupt9]   

old_interrupt9 DWORD ? 

int9_handler ENDP