Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Канальний рівень PPP




РРР використовує принципи, термінологію і структуру блоку даних процедур HDLC (ISO 3309-1979) Міжнародної організації по стандартизації (ISO - International Organization for Standardization), модифікованих стандартом ISO 3309-1984/PDAD1 "Addendum 1:start/stop Trasmission". ISO 3309-1979 визначає структуру блоку даних HLDC для вживання в синхронних оточеннях. ISO 3309-1984/PDAD1 визначає запропоновані для стандарту ISO 3309-1979 модифікацій, які дозволяють його використання в асинхронних оточеннях. Процедури управління РРР використовують визначення і кодування керівників полів, стандартизованих ISO 4335-1979 і ISO 4335-1979/addendum 1-1979. Протокол PPP розроблений для каналів зв'язки, які транспортують пакети між двома одноранговими об'єктами. Ці канали забезпечують повнодуплексне одночасне двонаправлене функціонування і передають пакети у відповідному порядку. Передбачається, що PPP забезпечить загальне рішення для нескладного зв'язку широкої різноманітності хостов, мостів і маршрутизаторів.

 

 

4. Розкажіть про перевірку на повторне встановлення резидентної програми

2.2. Захист резидентної програми від повторної установки

Як правило, в секції ініціалізації завантажуються вектори переривань, через які буде активізуватися програма. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми з залишенням в пам'яті її резидентної частини.

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

Найбільш поширеним методом захисту резидентної програми від повторної установки є використання переривання 2Fh, спеціально призначеного для зв'язку з резидентними програмами. Коли Ви робите цього переривання в регістрі АН задається номер функції (від 00h до FFh), а в регістрі AL - номер підфункції (у тому ж діапазоні). 00h - 7Fh зарезервовано для DOS/Windows 0B8h - 0BFh зарезервовано для мережевих функцій 0C0h - 0FFh відводиться для програм.

Для того, щоб резидентна програма могла відгукнутися на виклик переривання int 2Fh, в ній повинен бути обробник цього переривання. Фактично всі резидентні програми, як системні, так і прикладні, мають такі обробники, через які здійснюється не тільки перевірка на повторну установку, але і взагалі зв'язок з резидентну програму: зміна режиму її роботи або отримання від неї в транзитну програму якихось параметрів. Завдання дії, яке належить виконати обробникові переривання 2Fh конкретної резидентної програми, здійснюється за допомогою номера підфункції, що поміщаються перед викликом переривання в регістр AL

Таким чином, обробник переривання 2Fh резидентної програми повинен, перш за все, перевірити номер функції в регістрі АН; при виявленні "своєї" функції обробник аналізує вміст регістру AL і виконує витребувані дії, після чого командою iret передасть управління викликала його програмі. Якщо, проте, обробник виявив в регістрі АН "чужу" функцію, він повинен командою jmp CS: old_2fh передати управління по ланцюжку тому обробникові, адреса якого був раніше у векторі 2Fh. У результаті виклик int 2Fh з будь-якої програми буде проходити по ланцюжку через всі завантажені резидентні програми, поки не досягне "своєї" програми або не поверне управління в викликала програму через обробник DOS (який, очевидно, завжди буде самим останнім у ланцюжку).

Природно, для комунікації з резидентної програмою повинен бути встановлений деякий інтерфейс. Зазвичай при перевірці на повторну установку резидентна програма, якщо вона вже знаходиться в пам'яті, повертає в регістрі AL значення FFh, що є ознакою заборони вторинної завантаження. Іноді для більшої надійності ідентифікації "своєї" функції резидентна програма, крім значення FFh в регістрі AL, повертає ще якісь обумовлені заздалегідь коди в інших регістрах.

У резидентну частину варто включити обробник переривання 2Fh. Його розташування в межах тексту програми не має особливого значення, ми помістили його на початку резидентної частини. Секція ініціалізації зазнала великих змін. Вона повинна починатися з виклику переривання 2Fh з відповідною функцій для перевірки на повторну установку. Якщо перша копія програми вже завантажена, поточну програму потрібно завершити не функція 3th (завершити і залишити в пам'яті), а звичайною функцією завершення 4Ch. Якщо ж нашої програми в пам'яті немає, то в секції ініціалізації, крім заповнення її "робочого" вектора, в даному випадку 03h, слід також встановити наш обробник мультиплексного переривання.

Серед функцій мультиплексного переривання, призначених для прикладних програм, ми довільно вибрали для нашої програми функцію F1h, а для перевірки на повторну установку підфункції 00h. Резидентний обробник переривання 2Fh, що входить в нашу програму, перевіряє номери функції і підфункції і при виявленні будь-яких інших кодів передає управління наступного обробникові цього переривання. Якщо ж викликана функція F1h з підфункції 00h, оброблювач встановлює в регістрі AL значення FFh ( "я вже завантажений") і повертає керування в викликала програму командою iret.

Секція ініціалізації починається з перевірки на повторну установку. Після завантаження в регістр АН номера функції (F1h), а в регістр AL -- номера підфункції (00h), викликається переривання 2Fh. Після повернення з переривання аналізується вміст регістру AL Якщо обробник повернув значення FFh, програма повинна завершитися без залишення в пам'яті. Ці дії виконуються по мітці installed. Якщо повернуто інше значення, ініціалізація продовжується (для надійності варто було перевірити, чи повернуто саме 0). Зберігається старе вміст вектора 2Fh, встановлюється наш обробник цього переривання, після чого виконуються всі дії по встановленню, передбачені в попередньому варіанті програми динамічного дампа. При переході на мітку installed на екран виводиться повідомлення про неможливість повт?? рной установки і виконується функція завершення 4Сh з кодом повернення 01h. Останнє, звичайно, має символічний характер, оскільки цей код надалі не аналізується. 2.3. Вивантаження резидентної програми з пам'яті

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

програмних продуктів мають вбудовані засоби вивантаження. Зазвичай вивантаження резидентної програми здійснюється відповідної командою, яка подається з клавіатури і сприймається резидентну програму. Для цього резидентна програма повинна перехоплювати переривання, що надходять з клавіатури, і "виловлювати" команди вивантаження. Інший, боже простий спосіб полягає у запуску деякої програми, яка за допомогою, наприклад, мультиплексного переривання 2Fh передає резидентної програмі команду вивантаження. Найчастіше в якості "вивантажуються" використовують саму резидентну програму, точніше, її другий копію, яка, якщо її запустити в певному режимі, не тільки не намагається залишитися в пам'яті, але, навпаки, вивантажує з пам'яті свою першу копію.

вивантаження резидентної програми з пам'яті можна здійснити різними способами. Найпростіший - звільнити блоки пам'яті, які займає програмою (власне програмою та її оточенням) за допомогою функції DOS 49h. Другий, більш складний -- використовувати в вивантажуються програмі функцію завершення 4Ch, змусивши її завершити не саму вивантажують, а резидентну програму, та ще й після цього повернути управління в вивантажують. У будь-якому випадку перед звільненням пам'яті необхідно відновити всі вектори переривань, перехоплені резидентну програму. Слід підкреслити, що відновлення векторів представляє в загальному випадку значну і іноді навіть нерозв'язну проблему. По-перше, старе вміст вектора, яке зберігається десь у полях даних резидентної програми, неможливо витягнути "зовні", з іншої програми, тому що немає ніяких способів визначити, де саме його сховала резидентна програма в процесі ініціалізації. Тому вивантаження резидентної програми легше здійснити з неї самої, ніж з іншої програми. По-друге, навіть якщо вивантаження здійснює сама резидентна програма, вона може правильно відновити старе вміст вектора лише в тому випадку, якщо цей вектор не був пізніше перехоплений інший резидентну програму. Якщо ж це сталося, в таблиці векторів знаходиться вже адресу не вивантажується, а наступної резидентної програми, і якщо відновити старе вміст вектора, ця наступна програма "зависне", позбавивши засобів свого запуску. Тому надійно можна вивантажити тільки останню із завантажених резидентних програм.

В нашій програмі підфункції 00h переривання 2Fh служить для перевірки на повторну установку, а підфункції 01h - для розвантаження. У секцію ініціалізації додані рядки збереження старого вмісту вектора 09h. Це виконується точно так само, як і для вектора 2Fh - за допомогою функції DOS 35h. Старий вектор зберігається в комірці old_09h, що розміщується в резидентної частини програми. Оскільки вивантаження програми виконується за допомогою переривання 2Fh, текст обробника цього переривання ускладнюється.

Резидентний обробник переривання 2Fh насамперед перевіряє номер функції, що надійшов в регістрі АН, Якщо цей номер відрізняється від F1h, управління передається наступному обробникові по ланцюжку. Далі аналізується вміст регістру AL. Далі звільняється блок пам'яті з самою програмою. Сегментний адресу цього блоку (адреса PSP) знаходиться в регістрі CS. Нарешті, командою iret управління передасться в програму, що викликала переривання 2Fh.

Якщо програма запускається з клавіатури з вказівкою яких-небудь параметрів (імен файлів, ключів, які визначають режим роботи програми та ін.), то DOS, завантаживши програму в пам'ять, поміщає всі символи, введені після імені програми (так званий хвіст команди) префікс програмного сегмента програми, починаючи з відносного адреси 80h. Хвіст команди міститься в PSP в цілком певному форматі. У байт за адресою 80h DOS заносять число символів у хвості команди (включаючи пробіл, що розділяє на командному рядку саму команду і її хвіст). Далі (починаючи з байти за адресою 81h) дотримуються всі символи, введені з клавіатури до натиснення клавіші. Завершується хвіст колом повернення каретки (13).

До даних секції ініціалізації додалася рядок з очікуваним хвостом команди і байтовий прапор запиту на розвантаження.

Оскільки дії програми при її запуску залежать від того, введена чи команда запуску з параметром чи ні, наявність хвоста в PSP аналізується на самому початку секції ініціалізації. При запуску програми типу СОМ усі сегментні регістри вказують на початок PSP. Байт з довжиною хвоста (можливо, нульовий) поміщається в регістр CL і порівнюється з нулем. Якщо в ньому 0, команда запуску була введена без параметрів і ініціалізація програми продовжується звичайним чином. Якщо хвіст має ненульову довжину, починається його аналіз.

обнуленням регістра СН довжина хвоста "розширюється" на весь регістр СХ, що потрібно для організації циклу. Регістр DI налаштовується на перший байт хвоста, а регістр SI - на початок поля tail з очікуваною формою параметра. Регістр AL готується для виконання команди сканування рядка. Команда scasb порівнює в циклі байти хвоста з вмістом AL (кодом пробілу). Порівняння ведеться до тих пір, поки не буде знайдений перший символ, відмінний від пропуску. Ця операція необхідна через те, що оператор при введенні команди вивантаження може відокремити параметр команди від самої команди будь-якою кількістю пропусків, які потраплять у хвіст команди в PSP і перешкодять аналізувати введений параметр.

Ініціалізація здійснюється звичайним чином: зберігаються і встановлюються вектори і програма завершується з залишенням в пам'яті.

При наявності в пам'яті резидентного копії цієї програми здійснюється перехід на мітку installed, де перш за все перевіряється, чи встановлений прапор запиту на розвантаження. Якщо прапор скинутий, виводиться повідомлення про неможливість повторного завантаження і програма завершується з кодом повернення 1. Якщо прапор запиту встановлено, виконується вивантаження програми, яка полягає у виклику мультиплексного переривання 2Fh з функцією F1h і підфункції 01h. Резидентний обробник цього переривання, що входить до складу нашої резидентної програми, відпрацює цю підфункції, відновить вектори і звільнить зайняті програмою блоки пам'яті. Після повернення управління з обробника в поточну програму буде виведено повідомлення про успішну вивантаження і програма буде завершена функцією 4Ch з нульовим кодом повернення.

Складена нами програма не позбавлена від недоліків. Так, у ній аналізуються завжди тільки 3 значущих символу хвоста. Таким чином, програма буде вивантажено і при введенні команди (ім'я). Com onset. Інший недолік полягає в тому, що результат порівняння записаного в програмі хвоста з введенням з клавіатури параметром буде позитивним, тільки якщо з клавіатури введені малі літери. Команда (ім'я) OFF не приведе до вивантаження про-грами. По-справжньому слід було включити до програми перед аналізом хвоста перетворення символів параметра в прописні букви.

 

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 54; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты