6.1.3. Робота MS-DOS з блоками пам’яті
Нові
блоки пам’яті (й, отже, МСВ - блоки в ланцюжку) створюються або модифікуються
MS-DOS в декількох випадках:
1) при розподілі нового блоку
пам’яті;
2) при зміні розміру існуючого
блоку пам’яті;
3) при завантаженні та запуску
програми на виконання;
4) при резидентному завершенні
програми.
При розподілі нового блоку пам’яті (функція
АН= = 48h переривання 2 In) в регістрі ВХ специфікується тільки довжина
створюваного блоку в параграфах. MS-DOS відшукує перший МСВ - блок в ланцюжку,
позначений як вільний (частіше всього, це останній МСВ - блок ланцюжка блоків
пам’яті), розмір якого перевищує запитане значення. Якщо два та більш підряд
розташованих блоків позначені як вільні, при виділенні пам’яті вони
розглядаються як єдиний блок. МСВ обраного блоку (першого з підряд розташованих
вільних блоків) коректується:
1) в байти 1 і 2
записується номер параграфа поточного PSP (PID активної програми);
2) в байти 3-4 записується розмір створеного блоку. Якщо розмір
запитаної пам’яті менше розміру вільного блоку (підряд розташованих вільних
блоків), на границі "залишку" вільної пам’яті створюється МСВ; цей
знову створений МСВ включається в ланцюжок МСВ - блоків. новий МСВ не
створюється, якщо розмір запитаної пам’яті точно дорівнює розміру вільного
блоку (підряд розташованих вільних блоків).
Таким
чином, при виділенні блоку пам’яті MS-DOS робить "злиття" декількох
підряд розташованих вільних блоків. ці вільні блоки виникають, якщо програма
видасть запити розподілу та визволення, й існують до тих пір, поки не буде
зроблений запит на розподіл блоку. В цей момент MS-DOS проводить "ревізію"
ланцюжка МСВ - блоків.
При завантаженні й запуску програми на виконання
MS-DOS розподіляє під програму всю вільну пам'ять, через це будь - який запит
ALLOCATE MEMORY, виданий з меж запущеної програми, зіткнеться з проблемою
відсутності вільної пам’яті. При програмуванні на асемблері звільнення
невикористаної програмою оперативної пам’яті - обов'язок програміста. При
використанні Turbo С в склад завантажувального модуля "непомітно" для
програміста уставляється спеціальна програма-завантажник. вона, крім багатьох
інших дій, звільняє незайняту пам’ять. Детально функції програми-завантажника
Turbo С розглянуті в 6.2.
При виконанні функції SETBLOCK MEMORY (функція АН =
49h переривання 21h) в регістрі ES задається сегмент початку модифікованого
блоку, а в регістрі ВХ - новий розмір блоку в параграфах. Якщо розмір блоку
зменшується, на границі "залишку" створюється новий вільний блок.
Якщо здійснюється спроба збільшення розміру існуючого блоку, вона буде успішною
в випадку, якщо наступний в ланцюжку блок - вільний.
MS-DOS має
спеціальний засіб створення резидентних програм - так зване Т SR-завершення (Terminate but Stale
Resident) Резидентне завершення програми виконує функція MS-DOS AH=31h
переривання 21h ( .ЕХЕ- і .СОМ-файли) та переривання 27h (тільки .СОМ-файли)
При цьому в регістрі DX указується розмір блоку пам’яті від початку PSP,
оголошеного резидентним (кількість параграфів для DOS-функції 31П, кількість
байтів для int 27h). Початок блоку MS-DOS визначає по PID активної програми.
дії MS-DOS в випадку резидентного завершення подібні тім, які виконуються при
зміні розміру блоку. Блок, з якого починається PSP, усікається до запитаного
розміру, але залишається зайнятим після завершення програми. тому збережені там
дані та код програми не будуть перевизначатися при завантаженні нових програм й
(або) створенні нових блоків пам’яті. адже ця пам’ять, с точки зору MS-DOS,
залишається "зайнятою".
звільнення блоку пам’яті
(функція АН = 4Ah переривання 21 h) вимагає завдання в регістрі ES номера
параграфа початку блоку. цей функціональний виклик може видаватися або явно
самою програмою, або MS-DOS при завершенні програми. В байти 1 та 2 МСВ блоку, що звільняється, записуються нулі.
В реальному
режимі процесора 80х86 відсутні апаратні засоби захисту пам’яті від
несанкціонованого доступу. Тому неправильна робота програми при записі
інформації в пам’ять може привести до знищення або небажаної модифікації МСВ -
блоку. В результаті ланцюжок блоків розривається, й у MS-DOS виникають
нездоланні проблеми керування пам’яттю.
інша "неприємність"
- фрагментація оперативної пам’яті, виникаюча при резидентному завершенні
програм. Фрагментація - це стан
пам’яті, якщо чергуються вільні й зайняті блоки. Нефрагментована пам’ять - це пам’ять, в якій мається єдиний вільний
блок, що є останнім в ланцюжку МСВ; нефрагментованою також являється пам’ять, в
якій мається декілька вільних блоків, але всі вони в ланцюжку блоків
розташовані підряд і в самому кінці.
багато професійні програми використовують безпосередньо МСВ - блоки для
визначення наявності в пам’яті резидентних програм, їх "зняття",
виявлення та знищення програм-вірусів і т.д.
![]() |
![]() |
![]() |