Керування пам’ятю. Вивчення розподілу пам'яті в операційній системі MS DOS

Страницы работы

Содержание работы

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

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»

Кафедра “Обчислювальна техніка та програмування”

Лабораторна робота №4

з курсу “Системне програмне забезпечення”

 на тему: “Керування пам’яттю “.

Виконав:             

                                 студент  групи АП-30б   

                                                 Попов О.С.

Перевірив:

       Межерицький С. Г.

Харків 2002

Тема: “Керування пам’ятю.”

Мета: Вивчення розподілу пам'яті  в  операційній системі   MS DOS i отримання практичних навичок роботи з блоками керування пам'яттю.

Індивідуальне завдання.

Вивести на екран карту пам'яті, що розподіляється на власному робочому місці. Також вивести на екран розмір пам’яті, який займає наша програма.

Структура програми.

 Програма складається з основної програми i двох функцій.

void   get_DOS_ver_h (void) - функція, що повертає в глобальній змінній  DOS  старше число номеру версії   DOS .

void   print_head (void ) - функція, що виводить заголовок лабораторної роботи.

void  addr_psp (void) - функція, що одержує сегментний адрес префіксу програмного сегменту програми і що повертає його в глобальній змінній   pid__.

Опис змінних.

Змінні, глобальні для усієї програми :

cMSB - адреса поточного керуючого блоку пам'яті (MSB);

eMSB - адреса керуючого блоку пам'яті в якій міститься сегмент оточення програми;

memtop -   сегментна адреса початку ланцюжка керуючих блоків;

csem -   сегментна адреса поточного керуючого блоку;

othersegm -   сегментна адреса блоку оточення хазяїна поточного блоку пам'яті;

fathersegm -   сегментна адреса батька для програми-хазяїна поточного блоку;

envstr - адреса рядка оточення для програми-хазяїна поточного блоку пам'яті використовується для визначення ім'я програми з рядка виклику );

envlen - довжина чергового рядка оточення;

DOS  - старше число номеру версії   DOS ;

rr i sr - змінні, що використовуються для завдання значень регістрів загального призначення i   сегментних регістрів, відповідно, при виклику   переривання;

i -  допоміжна змінна, використовувана для отримання ім'я хазяїна блоку ( для версій   DOS  4.0 i  вище. );

n - число виведенних на екран рядків інформації про блоки (після виведення інформації про кожні 20-тi блоки, програма припиняє свою роботу i очікує на натиск будь-якої клавіши );

s-покажчик на ім'я хазяїна блоку ( якщо використовується версія DOS не нижче 4.0).

pid__ - сегментний адрес префіксу програмного сегменту програми.

Опис алгоритму програми.

Як завжди, для початку роботи ми повинні налаштувати компілятор С++. Отже ми встановлюємо тип пам’ті LARGE та робимо ще деякі зміни у настройках.    

  На початку виконання програми визначимо номер версії   DOS, встановленої на даній ПЕОМ. Після цього за допомогою функції 52h DOS (переривання 21h) визначимо адресу системних керуючих блоків :

                  Вхід :   Ah   =   52h

                  Вихід :   ES:BX - адреса 1-го блоку параметрів диску.

Виконуючи віднімання з цієї адреси 2, одержимо адресу того слова пам'яті в якому DOS  зберігає   сегментну адресу першого керуючого блоку пам'яті. Кожен блок пам'яті  контролюється  Керуючим Блоком Пам'яті (MSB - Memory  Control   Block ). MSB має   фіксований pозміp 1 паpагpафа і   фоpмат, який  описується наступною   стpуктуpою :

struct   MSB

                        {   byte   type;                      /* тип*/

                                 word   owner;              /* власник*/

                                 word   size;                  /*розмiр*/

                                 byte   reserved [3];      /* не використовуїться*/

                                 char   pgmname [8];    /* iм'я ( тiльки DOS 4.0 i вище)*/

                          };

  Поле type MSB мають у собі код, що показує, чи є цей MSB останнiм ( код літери  Z - 0x5a) чи  не останнім (код літери  M - 0x4d ). Поля   owner мають у собі  Pid (сегментний адpес префікса пpогpамного сегменту)  пpогpами, яким даний блок пам'яті належить. Якщо значення цього поля нульове, то блок  вільний. Поле size має pозміp блоку пам'ятi в паpагpафах ( в це число не включений 1  паpагpаф, займаний самим   MSB ). Наступні 3 байта ( поля reserved ) заpезеpвовані в усіх   веpсіях. Поле pgmname   заpезеpвовано (не використовується )у веpсiях DOS  нижче 4.0. Починаючи з   веpсії 4.0, в   MSB, записано ім'я (без pозшиpення) пpогpамми, що знаходиться в цьому сегменті (якщо довжина ім'я менше 8 символів, воно закінчується   нульовим байтом ).

Похожие материалы

Информация о работе