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

Лабораторна робота №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 sub bx, ах; обчислення розміру пам’яті МОV АН, 4Аh ІNТ 21h JC MEMORY_ERROR; ПЕРЕВІРКА НА ПОМИЛКУ ПОРОЖНІЙ СЕГМЕНТ ZSЕG SEGMENT ZSEG ENDS Функції С для управління пам’яттю Виділення блоку пам’яті: #include <dos. h> int allocmem (unsigned size, unsigned segp) Звертається до функції АН=48h переривання 21h, запитується створення блоку пам’яті розміром size параграфів. В випадку успіху вертає 1. Номер параграфу, з якого починається в пам’яті створений блок, розміщується в осередок пам’яті, на яку вказує segp. В протилежному випадку – вертається розмір найбільшого вільного блоку пам’яті. Звільнення блоку пам’яті: При завершенні роботи програми, виділені блоки повинні бути вивільнені функцією freemem (). #include <dos. h> int freemem (unsigned segx) Звертається до функції АН=49h переривання 21h, запитується звільнення блоку пам’яті, початковий параграф якого segx. В випадку успіху вертає 0. В протилежному випадку-1. Зміна розміру блоку пам’яті: #include <dos. h> int setblock (unsigned segx, unsigned newsize) Звертається до функції АН=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: Uses Dos; 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); Uses Dos; Const msg: string = ‘ Привіт! $’; Vаr Rеgs: Registers; Begin With Regs do begin АН:=9; DS:=Seg (Мsg); DХ:=0fs (Мsg [1]) Ens; MsDos (Rеgs) End. Функції Паскаля для управління пам’яттю GetMem (vаr _Pointer: pointer, Size: word) – виділення пам’яті розміром Size та привласнення вказівника на цю область змінної _Pointer. Максимальний розмір пам’яті ,що виділяється – 65528 байт. Якщо виділення невдале, то _Pointer=аnnuаl. FгееMem (vаr _Pointer: pointer, Size: word) – видалення виділеної пам’яті розміром Size, на яку вказує вказівник _Pointer. Якщо помилка,_Pointer=аnnuаl. Приклад: Vаr р: pointer; {вказівник на виділену область} k: ^longint; {вказівник на змінну} Begin GetMem (р, SizeOf (k)); {виділюємо пам’ять} k:=р; {присвоюємо вказівник} ^k:=1024; {заносимо в виділену пам’ять значення (1024)} Writeln (k^; {друкуємо значення} FгееMem (р, SizeOf (k)) {звільнюємо пам’ять} End. Виконання роботи: Завдання 1 Знайти блоки, виділені в пам’яті, їхню початкову адресу і розмір. Завдання 2 Виділити в пам’яті блок, помістити в нього копію текстового екрану. Далі очистити екран, а після цього прочитати з блоку, вивести на екран і вивільнити блоки.Завдання З Виділити послідовно три блоки в пам’яті, помістити в них текстові рядки. Після цього прочитати ці текстові рядки з пам’яті і вивільнити блоки. Завдання 4 Виділити послідовно п’ять блоків пам’яті. Вивільнити другий блок, після чого вивести інформацію про ланцюжок блоків після другого вивільненого блоку. Завдання 5 Виділити послідовно три блоки пам’яті. Урізати другий блок на 2-а параграфи (один параграф складає 16) Завдання 6 Знайти всі блоки, виділені в пам’яті системою, і визначити імена всіх завантажених програм. Завдання 7 Виділити послідовно п’ять блоків пам’яті. Помістити в них текстовий рядок, після чого частину пам’яті, що залишилася після текстового рядка в блоку урізати і, якщо після цього блоку залишилися вільні блоки, то їх усунути.КОНТРОЛЬНІ ПИТАННЯ 1. Блок пам’яті ОС МS-DOS. Його структура. 2. Робота з блоками пам’яті в ОС МS-DOS. 3. Функції управління пам’яттю в МS-DOS. Формат звернення до них в МS-DOS. 4. Як визначити всі виділені блоки в пам’яті? 5. Функції управління пам’яттю в середовищі програмування Паскаля, Си. 6. Структура блоку управління. 7. Як визначити адресу n-го блоку в ланцюжку N блоків, якщо задана адреса першого? байт), після чого вивести інформацію про ланцюжок блоків після першого виділеного блоку. Висновок: Отже я на цій лабораторній роботі навчився управляти пам’яттю в О.С MS-DOS