Смекни!
smekni.com

Управління пам яттю в МS-DOS Описані основні ф-ції управління памяттю в ОС Ms-Dos (стр. 1 из 2)

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

Тема: Управління пам'яттю в МS-DOS.

Мета: Вивчити управління пам'яттю в МS-DOS.

Хід роботи:

1. Вивчити розділ III "Стислі теоретичні відомості і методичні вказівки".

2. Виконати поставлене завдання згідно варіанту.

Теоретичні відомості:

МS-DOS є однопрограмною однокористувачевою операційною системою, що здатна стежити за доступним адресним простором не більш 640 Кбайт.

В склад МS-DOS включені три функції переривання 21h для управління пам'яттю:

АН = 48h - розподілу пам'яті (виділенняблоку)

АН=49h - звільнення пам'яті (звільненняблоку)

АН=4Аh - зміна розміру блоку пам'яті

Блок - це безперервна область, що визначається обсягом доступної пам'яті. Його розмір може бути більше одного сегменту (64К).

Для того, щоб від слідкувати розподіл пам'яті, МS-DOS веде спеціальний зв'язний список керуючих блоків (блоків управління пам'яттю). Кожний блок управління пам'яттю , займає один параграф і безпосередньо передує власне блоку пам'яті - безперервної області пам'яті що починається на 16-байтовій межі.

Спеціальна внутрішня змінна МS-DOS зберігає покажчик на перший блок управління пам'яттю ланцюжка.

Значущими е перші 5 байт блоків управління пам'яттю.

Байт 0 - байт статусу. Якщо в ньому записане 4Dh ('М)', то за цим блоком є ще блоки, якщо записане 5Аh ('Z)', то блок останній в ланцюжку.

Байти 1-2 - рівні нулю, якщо блок вільний; більше нуля, якщо блок зайнятий. В цьому випадку байти містять покажчик на префікс програмного сегменту (ППС) програми, якій належить блок.

Байти 3-4 - містять розмір блоку у 16-байтових параграфах.

Номер параграфу (сегмент адреси), по якому розташується наступний блок управління пам'яттю визначається за формулою

Seg_mcb=seg_mcb_old+length+1,

Де seg_mcb_old - сегмент, по якому розташується попередній блок управління пам'яттю ланцюжка блоків;

Length- довжина попереднього блоку в параграфах (байти 3-4 попереднього блоку, управління пам'яттю).

Якщо блок управління пам'яттю останній в ланцюжку, то при обчисленнях буде отримане значення, що задає сегмент межі оперативної пам'яті, доступної МS-DOS.

Робота з блоками пам'яті

Нові блоки пам'яті створюються, модифікуються або знищуються в наступних випадках:

І) при розподілі нового блоку пам'яті;

II) при зміні розміру існуючого блоку пам'яті;

III) при завантаженні і запуску програми на виконання

IV) знищенні блоку

Зростання адресБлок керування пам'яттю 2Блок керування пам'яттю 1 Оперативна пам'ять 16(n+1) 3,4 байт 1,2 0
Блок пам'яті 2
Блок пам'яті 1
Число параграф, n в блоці пам'яті
Вказівник на ППС програми
4D

І. При розподілі нового блоку пам'яті (функція АН=48h переривання 21h) в регістрі ВХ специфікується тільки довжина створюваного блоку в параграфах. МS-DOS відшукує перший блок управління пам'яттю позначений як вільний (найчастіше це останній блок управління пам'яттю), розмір якого перевищує запрошене значення.

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

1) в байти 1 і 2 записується покажчик на префікс програмного сегменту поточної програми.

2) в байти 3-4 записується розмір створеного блоку.

Якщо розмір запрошеної пам'яті менше розміру вільного блоку (або підряд розташованих вільних блоків) то на межі "залишку" вільної пам'яті створюється ще один блок управління пам'яттю і цей блок включається в ланцюжок блоків управління пам'яттю. Стартова адреса отриманого блоку дорівнює АХ: 0.

Для того щоб знайти всі виділені блоки пам'яті в ОС, можна скористуватися функцією 52h переривання 21h. Результатом її роботи є сегмент і зміщення області пам'яті з внутрішньою інформацією про ОС. При цьому сегмент розміщується в регістрі ЕS, зміщення в ВХ-2.

II. При зміні розміру блоку використовується функція АН=АП переривання 21h. При цьому в регістрі ЕS задається сегмент початку блоку ,що модифікується, а в регістрі ВХ - новий розмір блоку в параграфах. Якщо розмір блоку зменшується, то на межі залишку створюється новий вільний блок. Якщо блок збільшується, він може бути збільшений, якщо наступний блок вільний.

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

При програмуванні на асемблері невикористану завантаженою програмою пам'ять повинен вивільняти програміст. При програмуванні на мовах високого рівня пам'ять визволяє спеціальна програма завантажувач.

IV. При знищенні блоку використовується функція АН=49h переривання 21h. При цьому в регістрі ЕS задається сегмент початку блоку, що модифікується. Цю функцію може видати або програма, або МS-DOS при завершенні роботи програми. Якщо яка-небудь програма розподілила для себе блок пам'яті, то по закінченню своєї роботи вона повинна його визволити. В протилежному випадку блок буде вважатися зайнятим.

Якщо одна з цих функцій не може бути виконана, то встановлюється прапор переносу, а в АХ вертається код помилки:

7 - зруйнований керуючий блок пам'яті,

8 - недостатньо пам'яті для виконання функції,

9 - невірна адреса блоку.

Функція відведення блоку використає коди 7 і 8, звільнення - 7 і 9, зміни блоку - 7, 8, 9.

В МS-DOS відсутні засоби захисту пам'яті від несанкціонованого доступу. Тому невірна робота програми при запису інформації може призвести до знищення або модифікації одного з блоків управління пам'яттю. В результаті ланцюжок розривається і МS-DOS не може керувати пам'яттю.

Приклад 1:

Відводиться блок розміром 1024 байти. ВХ містить число 16-байтових параграфів, при завершенні стартова адреса блоку рівна АХ: 0. Друга частина програми вивільняє блок.

відведення блоку пам'яті

МОVАН,48h

МОV ВХ, 64

ІNТ21h

JC ERROR

МОV ВLОСК_SЕG, АХ; збереження адреси блоку

звільнення блоку

МОV АХ, ВLОСК_SЕG; отримання стартової адреси блоку

МОV ЕS, АХ

МОV АН, 49h

ІNТ21h

Приклад 2:

Коли програмі написаній на асемблері потрібна додаткова пам'ять під дані, то програміст повинен попіклуватися про звільнення пам'яті, бо МS-DOS відводить під

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

Для зміни розміру блоку використовується функція АН=4Аh. Функція 4Аh вимагає адресу початку блоку пам'яті і його новий розмір. ЕS містить значення першого байту програми. Якщо розмір блоку змінюється не в початку програми, то ЕS треба зберегти.

Для визначення розміру блоку треба визначити розмір програми в пам'яті. Для цього створюється фіктивний сегмент в кінці програми з ім'ям ZSЕG. Програма може прочитати позицію цього сегменту і, порівнюючи з початковим сегментом, отримати кількість пам'яті потрібну програмі.

ЗВІЛЬНЕННЯ ПАМ'ЯТІ

МОV ВХ, ZSЕG

МОV АХ, ЕS

subbx, ах; обчислення розміру пам'яті

МОV АН, 4Аh
ІNТ 21h

JCMEMORY_ERROR; ПЕРЕВІРКА НА ПОМИЛКУ

ПОРОЖНІЙ СЕГМЕНТ

ZSЕGSEGMENT

ZSEG ENDS

Функції С для управління пам'яттю

Виділення блоку пам'яті:

#include <dos. h>

intallocmem (unsigned size, unsigned segp)

Звертається до функції АН=48h переривання 21h, запитується створення блоку пам'яті розміром size параграфів. В випадку успіху вертає 1. Номер параграфу, з якого починається в пам'яті створений блок, розміщується в осередок пам'яті, на яку вказує segp. В протилежному випадку - вертається розмір найбільшого вільного блоку пам'яті.

Звільнення блоку пам'яті:

При завершенні роботи програми, виділені блоки повинні бути вивільнені функцією freemem().

#include <dos. h>

intfreemem (unsigned segx)

Звертається до функції АН=49h переривання 21h, запитується звільнення блоку пам'яті, початковий параграф якого segx. В випадку успіху вертає 0. В протилежному випадку-1.

Зміна розміру блоку пам'яті:

#include <dos. h>

intsetblock (unsignedsegx, unsignednewsize)

Звертається до функції АН=4Аh переривання 21h, запитується зміна розміру блоку пам'яті з новим розміром з size параграфів, початковий параграф, якого segx. В випадку успіху вертае-1. В протилежному випадку - вертається розмір найбільшого вільного блоку пам'яті.

Виклик переривань з Паскаля

Для виклику переривань в системному модулі DOS є 2-і стандартні процедури.

Перша процедура Intr дозволяє безпосередньо викликати програмні переривання. Заголовок цієї процедури має такий вигляд:

Intr (Іn: bуtе; vаr Rеgs: Registers),

де Іn - номер програмного переривання;

Rеgs- запис, з допомогою якого передаються параметри, означеного переривання. Тип цього запису Registers в модулі DOS визначається так:

Туре

Registers = record

cаsе integer оf

0: (АХ, ВХ, СХ, DХ, ВР, SI, DI, DS, ЕS, Flags: word);

1: (АL, АН, ВL, ВН, СL, СН, DL,DН: bуtе)

End;

Приклад використання процедури Intr для визначення розмірів основної і розширеної (extended) оперативної пам'яті ЕОМ. Процедура використає переривання з шістнадцятьковими номерами $12 і $15:

UsesDos;

Vаr

DosМ, EхtМ: word;

prосеdurе ТоtаlMemоrу (var DosMemоrу, ЕхtMemоrу: word);

Vаr

Rеgs: Registers

Begin

With Regs do begin

Intr ($12, Regs);

DosMemоrу:=АХ; {в поле АХ вертається розмір основної пам'яті}

АХ:=$8800;

Intr($15,Regs);

ЕхtMemоrу:= АХ; {в поле АХ вертається розмір розширеної пам'яті}

End

End;

Begin

ТоtаlMemоrу (DosМ, EхtМ);

Writeln (Основна пам'ять Dos= DosМ, 'К)';

Writeln ( ' Розширена пам'ять =',DosЕ, 'К)'

End.

Друга процедура - MsDos, що використовується для звернення до операційної системи, має ім'я MsDos і реалізує виклик конкретного переривання з шістнадцятьковим номером $21.

Єдиним параметром процедури MsDos е запис типу:

Registers:

MsDos (vаr Rеgs: Registers).

Приклад використання - вивід рядка (9-а функція Dos);

UsesDos;