НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»
Лабораторна робота №4
з курсу “Системне програмне забезпечення”
на тему: “Керування пам’яттю “.
Виконав:
студент групи АП-30б
Попов О.С.
Перевірив:
Межерицький С. Г.
Тема: “Керування пам’ятю.”
Мета: Вивчення розподілу пам'яті в операційній системі 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 символів, воно закінчується нульовим байтом ).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.