Управління пам'яттю - скачати безкоштовно
Химия

Управління пам’яттю — скачати безкоштовно


Завантажити реферат: Управління пам’яттю

Зміст реферату

1. Загальні відомості

2. Маніпуляції з пам’яттю.

Література:

1. Загальні відомості

Починаючи з версії 2.00, DOS розподіляє пам’ять та надає прикладним програмам три операції для роботи з блоками пам’яті. Це операції 48 — виділити пам’ять, 49 — звільнити пам’ять, 4A (Setblock) змінити розмір виділеного блоку пам’яті.

Розподіл пам’яті виробляється так: кожному за вільного чи зайнятого блоку пам’яті DOS будує управляючий блок. Коли програма звертається до операції «виділить», DOS знаходить блок вільної пам’яті, що задовольняє запит і «вирізує» з нього необхідний шматок.

Програмі, що звернулася, повертається адреса першого байта виділеного блоку; при цьому йому будується керуючий блок (інший керуючий блок показує, скільки місця залишилося в блоці пам’яті, від якого відрізаний цей блок). При операції зміни довжини для укорочування блоку DOS будує керуючий блок для області пам’яті, що звільняється, і додає його до списку вільних блоків. Таким чином, якщо якась програма змінює пам’ять, яка не виділена їй, ймовірно, що вона зіпсує керуючий блок системи розподілу пам’яті. Це призводить до непередбачуваних результатів — зазвичай до помилки розподілу пам’яті, виправити яку можна лише перезапустивши систему.

Коли завантажується програма, DOS виконує операцію 48 (Exec) так само, як і при зверненні з прикладної програми. Ця операція має два варіанти: підоперацію 0 для завантаження та виконання програм і підоперацію 3 для завантаження сегмента перекриттів без його виконання. Хоча обидві операції виконують завантаження однаково, з погляду управління пам’яттю вони різняться.

При подоперации 0, DOS виділяє завантажуваній програмі максимальний доступний блок пам’яті (у ньому розміщується Префікс Програмного Сегмента).

Потім Exec завантажує програму. Таким чином, завантажена програма, як правило, має всю вільну пам’ять, включаючи нерезидентну область COMMAND.COM, в якій розташований завантажувач. Якщо тепер вона звернеться до операції Exec для виклику іншої програми, операція поверне помилку, оскільки не знайде вільної пам’яті. Більше того, якщо програма затерла завантажувач, необхідно знайти пам’ять для його підкачування.

Примітка. Для програм .EXE розмір пам’яті, що виділяється, розмір розміру образу задачі плюс значення поля MAX ALLOC заголовка завантажувального модуля. Якщо стільки пам’яті недоступно, виділяється розмір образу завдання плюс не менше, ніж зазначено в полі MIN ALLOC заголовка модуля завантаження. Ці поля заповнюються компонувальником LINK. За умовчанням, він ставить туди значення, що виділяють задачі максимально можливу пам’ять.

Правильно написана програма має звернутися до операції Setblock та відмовитися від непотрібної їй пам’яті. ( Програма типу .COM повинна попередньо встановити власний стек, тому що вагома ймовірно, що той стек, який вона отримує від DOS лежить в області пам’яті, що звільняється). Звільнена пам’ять може бути використана для завантаження інших завдань або завантажувача. Це також необхідно для мультипрограмування, яке буде доступне в майбутньому.

Якщо програма потребує додаткової пам’яті, вона може отримати її звернувшись до операції DOS, а потім звільнити її.

Коли програма, викликана операцією Exec, закінчується, основний блок її пам’яті автоматично звільняється. Інші блоки, які були виділені їй за запитами, не звільняються — програма має їх явно звільнити до завершення. (Примітка перекладача: мій досвід роботи з DOS не відповідає цьому: після завершення завдання звільняються всі запрошені нею блоки).

При виконанні підоперації 3 не створюється префікс програмного сегмента та пам’ять автоматично не виділяється; програма, що викликає, повинна сама визначить можливості підзавантаження і виділить для неї пам’ять. Операція завантаження не перевіряє, куди потрапляє завдання, що завантажується — в область пам’яті, що належить викликало завдання чи ні, і може зіпсувати керуючі структури DOS.

Програми, завантажені операцією 3 не мають власної пам’яті їх пам’ять належить завдання, що викликало. Звернення до них проводиться завданням без втручання DOS; тому при виході жодних автоматичних дій з управління пам’яттю не провадиться — справа викликаючої програми вирішувати чи звільнити пам’ять, чи викликати в неї ще одну програму. Зауважимо, що якщо програма, що закінчується, запитувала у DOS пам’ять, вона повинна звільнити її до виходу.

2. Маніпуляції з пам’яттю.

Коли MS DOS завантажує програму, то вона поміщається в молодшу область пам’яті, відразу ж за COMMAND.COM і встановленими драйверами пристроїв або множин. У цей момент часу все пам’ять за програмою повідомлено цій програмі. Якщо програмі потрібна пам’ять для створення області даних, то вона може при лиженно вирахувати де в пам’яті закінчується її код і потім додати до неї пом’якшити до кімнати. Для визначення відмінності кінця програми програми помістіть в кінці програми позадогмент типа:

   ZSEG    SEGMENT
;>

справді помістити ці рядки в кінці програми. У самій програмі достатньо поставити оператор MOV AX, ZSEG і AX буде вказувати на перший вільний сегмент пам’яті за програмою.

Такий підхід буде працювати до тих пір, поки програма не буде припускати про наявність пам’яті, якою на самій справі немає. Він не буде також працювати в багатокористувальному середовищі, коли кілька програм можуть ділити між собою одну і ту ж область адрес. Для вирішення цієї проблеми MS DOS має можливість відстежувати 640K системної пам’яті і відповісти за вимогою програми блоки пам’яті будь-якого розміру. Блок пам’яті — це просто неперервна область пам’яті, його максимальний розмір визначається розміром доступної пам’яті, в основному, він може бути. Якщо затребуваний надто великий блок, то DOS видає повідомлення про помилку. Будь-яка можливість перекриття блоків виключена. Крім того MS DOS може освобождать, урізати або розширювати існуючі блоки. Хоча програма не зобов’язана використовувати ці засоби, але зручно і завбачливо робити це. Деякі функції DOS вимагають, щоб були використані сродки управління пам’яттю DOS, наприклад, завершення резидентної програми [1.3.4] або виклик іншої програми з даної [1.3.2].

Перш ніж відповісти пам’ять, що існує блок (вся пам’ять від початку програми до кінця) повинен бути утворений до розміру програми. Потім, при створенні блоку, DOS створить 16-байтний керуючий блок пам’яті, який розташований безпосередньо перед блоком пам’яті. Перші 5 байтів цього блоку мають наступне значення:

байт 0 ASCII 90 — якщо останній блок в ланцюжку, інакше
ASCII 77.
байти 1-2 0 якщо блок звільнений
байти 3-4 розмір блоку в 16-байтних параграфах

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

MS DOS забезпечує три функції розділення пам’яті, номера від 48H до 4AH переривання 21H. Функція 48H свідчить блок пам’яті, а 49H звільняє блок пам’яті. Третя функція («SETBLOCK») змінює розмір пам’яті, відповідної для програми; ця функція повинна бути використана перед двома іншими. Після її виконання можна спокійно відповісти і звільняти блоки пам’яті. Програма повинна звільнити всі відповідні ею блоки перед завершенням. Інакше ця пам’ять буде недостатньою для подальшого використання.

Середній рівень.

Всі три функції розподілу пам’яті переривання 21H використовують 16-бітний відбиток початку блоку пам’яті, з яким вони оперують. Цей відсоток відповідає сегменту, з якого починається блок (блок завжди починається зі зміщення 0 даного сегменту). Таким чином родовий відмінок осередку почала блоку рівниць цьому одкрову, змноженому на 16. Також, для всіх трьох функцій, BX містить число 16-разових. Якщо функція не може бути виконана, то встановлюється прапор перенока, а в AX повертається кид помилки, що пояснює причину. Можливі три коди помилки:

   7   paзpушeн упpaвляющий блoк пaмяти
8 нeдocтaтoчнo пaмяти для выпoлнeния функции
9 нeвepный aдpec блoкa пaмяти

Функція відповіді блоку використовується коди 7 і 8, а вивільнення — 7 і 9, в той час як функція зміни блоку використовується всі три коди. У наступному прикладі спочатку відповідає блок, розміром 1024 байта. При цьому BX містить потрібне число 16-байтних параметрів, а при завершенні стартовий відсоток блоку рівнів AX: 0 (тобто зміщення 0 в годину). Друга частина прикладу звільняє цей же блок, як і вимагається при завершенні програми. В даному випадку значення отримане в AX поміщається в ES. DOS слід за розміром блоку і знає яке кількість параграфів треба звільнити.

;---oтвeдeниe блoкa paзмepoм 1024 бaйтa
MOV AH,48H ;нoмep функции
MOV BX,64 ;тpeбуeм 64 пapaгpaфa
INT 21H ;пытaeмcя oтвecти блoк
JC ERROR ;oбpaбaтывaeм oшибку в cлучae нeудaчи
MOV BLOCK_SEG,AX;инaчe coxpaняeм aдpec блoкa
.
;---ocвoбoждaeм тoт жe блoк
MOV AX,BLOCK_SEG ;пoлучaeм cтapтoвый aдpec блoкa
MOV ES,AX ;пoмeщaeм eгo в ES
MOV AH,49H ;нoмep тpeбуeмoй функции
INT 21H ;ocвoбoждaeм блoк пaмяти

Кінець, приведемо приклад використання функції 4AH. ES містить значення сегмента PSP, тобто. найпершого байта пам’яті, з якого завантажена програма. Це значення присвоюється ES при старті задачі.

Для використання SETBLOCK треба або викликати цю функцію в самому початку програми (перш ніж ES буде змінений), або спочатку для початку.

BX містить потрібний розмір блоку в 16-байтних параметрах. Для визначення цього розміру помістіть додатковий «штучний» сегмент у кінець програми. В макроаccсемблepe IBM PC сегменти розташовуються в алфавітному порядку, тому Ви можете помістити його в будь-яку місце програми, за умовою-ч. В інших accemblepax дійсно поміщайте фіктивний сегмент у кінець програми. Програма може прочитати позицію цього сегменту і, порівнюючи її зі статевим сегментом, отримати кількість пам’яті, потрібне цією програмою. B момент завантаження програми і ES і DS містять номер параграфа самого початку програми в програмі програмного сегменту; для COM файлів CS також вказує на цю позицію, але для EXE файлів це не так. ;—звільнення пам’яті (ES має значення при старті)

   MOV   BX,ZSEG      ;пoлучaeм # пapaгpaфa кoнцa пpoгpaммы + 1
MOV AX,ES ;пoлучaeм # пapaгpaфa нaчaлa пpoгpaммы
SUB BX,AX ;вычиcляeм paзмep пpoгpaммы в пapaгpaфax
MOV AH,4AH ;нoмep функции
INT 21H ;ocвoбoждaeм пaмять
JC MEMORY_ERROR ;пpoвepяeм нa oшибку
;-- ZSEG SEGMENT
ZSEG ENDS

Література:

1. Джордан Довідник програміста персональних комп’ютерів

2. Нортон Архітектура персональних комп’ютерів фірми IBM

3. Бек Введення у системне програмування

© Реферат плюс



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *