11696

Використання розширеної памятіта можливостей XMS драйверів

Лабораторная работа

Информатика, кибернетика и программирование

ЛАБОРАТОРНА РОБОТА №12. Тема: Використання розширеної пам’ятіта можливостей XMS драйверів. Ціль: Отримати практичні навички звернення до драйвера розширеної памяті і вивчити її основні функції. Теоретичні ві...

Украинкский

2013-04-10

106.5 KB

0 чел.

ЛАБОРАТОРНА РОБОТА №12.

Тема:  Використання розширеної памятіта можливостей XMS драйверів.

Ціль:  Отримати практичні навички звернення до драйвера розширеної пам'яті і вивчити її основні функції.

 

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

             Будучи встановлений в операційній системі, драйвер HIMEM.SYS надає програмам інтерфейс відповідно до специфікації XMS (eXtended Memory Specification), розроблений корпораціями LOTUS, INTEL, MICROSOFT, AST Research.  Цей драйвер розширює основний адресний простір 640K ще приблизно на 64 кілобайти і надає відносно зручний засіб для зберігання в розширеній пам'яті масивів даних.

Установка драйвера HIMEM.SYS

Для установки драйвера файл CONFIG.SYS повинен містити рядок:

device=[d:][путь]himem.sys [/HMAMIN=h] [/NUMHANDLES=n]

Параметр /HMAMIN= (необов'язковий) задає мінімальний розмір пам'яті, який можуть використовувати програми в області HMA. Розмір задається в кілобайтах. Сенс використання цього параметра полягає в тому, щоб дозволяти використовувати область HMA тільки тим програмам, які зажадають з цієї області не менше за h кілобайти. Це треба для того, щоб ефективніше використовувати область HMA.

Якщо параметр не заданий, використовується за умовчанням значення 0. Це означає, що перша ж програма, що запросила область HMA, дістане до неї доступ. Програма, запущена услід і, можливо, що використовує цю пам'ять ефективніший від, вже не зможе скористатися областю HMA.

Максимальне значення параметра h - 63.

Параметр /NUMHANDLES= задає максимальну кількість областей розширеної пам'яті (блоків EMB), яке може бути запрошене програмами. Діапазон значень, що задаються, від 1 до 128, значення за умовчанням - 32. Задаючи великі значення n, пам'ятайте, що на управління кожним блоком EMB витрачається 6 байт резидентної пам'яті.

Специфікація XMS

Специфікація XMS містить опис програмного інтерфейсу драйвера HIMEM.SYS і рекомендації по використанню області пам'яті HMA.

Перевірка підключення драйвера

Перше, що повинна зробити програма, яка збирається викликати драйвер HIMEM.SYS - перевірити, чи був встановлений цей драйвер при завантаженні операційної системи.

Для цього потрібно завантажити в регістр AX значення 4300h і викликати переривання INT 2Fh. Якщо після цього регістр AL міститиме значення 80h, драйвер встановлений, інакше - ні.

Приведемо фрагмент програми, перевіряючої підключення драйвера :

; Перевіряємо, чи встановлений драйвер HIMEM.SYS

               mov   ax, 4300h

               int   2fh

               cmp   al, 80h

               je    HMM_installed ; Виконуємо перехід

                                                       ; якщо драйвер встановлений

Отримання адреси програми, що управляє

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

Цю адресу можна отримати, якщо завантажити в регістр AX значення 4310h і викликати переривання INT 2Fh. Переривання поверне сегментну адресу програми, що управляє, в регістрі ES, зміщення - в регістрі BX :

; Отримуємо адресу функції драйвера, що управляє

               mov   ax, 4310h

               int   2fh

               mov   word ptr cs:[HMMEntry][0], bx

               mov   word ptr cs:[HMMEntry][2], es

Надалі отримана адреса використовується для виконання функцій по обслуговуванню розширеної пам'яті. Перед викликом програми, що управляє, код необхідної функції має бути завантажений в регістр AH :

; Отримуємо номер версії драйвера HIMEM.SYS

               mov   ax, 0

               call  [HMMEntry]

Програми, які звертаються до функції, що управляє, повинні перед викликом функції мати розмір стека не менше 256 байтів.

Опис функцій драйвера HIMEM.SYS

Усі функції драйвера HIMEM.SYS можуть бути розділені на наступні п'ять груп:

  •  функції отримання інформації про драйвер (0h);
  •  функції управління областю HMA (1h..2h);
  •  функції управління лінією A20 (3h..7h);
  •  функції управління розширеною пам'яттю (8h..Fh);
  •  функції управління блоками UMB (10h..11h).

Приведемо детальний опис цих функцій відповідно до специфікації XMS версії 2.0.

Отримати версію XMS

На вході:       AH = 00h.

На виході:      AX = номер версії XMS;

                               BX = номер внутрішньої модифікації драйвера;

                               DX = 0001h - якщо існує область HMA

                    0000                     0000h - якщо область HMA не існує.

Помилки: немає.

Функція повертає номери версії і модифікації XMS в двійково-десятковому (BCD) форматі. Наприклад, якщо AX=0250h, це означає, що драйвер реалізує специфікацію XMS версії 2.50. Додатково функція дозволяє перевірити наявність в системі області HMA.

Запросити область HMA

На вході:       AH = 01h;

                               DX = розмір пам'яті в байтах в області HMA

                               яка використовуватиметься резидентними

                               програмами або драйверами, звичайна

                               програма повинна використовувати значення

                               DX=FFFFh.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, 81h, 90h, 91h, 92h (опис кодів

                               помилок буде наведено після опису

                               усіх функцій).

За допомогою цієї функції програма може зарезервувати для себе область HMA. Що задається в регістрі DX розмір пам'яті порівнюється з вказаним в параметрі драйвера /HMAMIN=. Область HMA розподіляється програмі, що запросила, тільки у тому випадку, якщо запрошений в регістрі DX розмір більше або рівний вказаному в параметрі /HMAMIN. Такий механізм дозволяє обмежити використання області HMA тільки тими програмами, які використовують її якнайкраще.

Пояснимо це на прикладі. Нехай при ініціалізації операційної системи з файлу AUTOEXEC.BAT запускаються дві програми. Одна з них використовує 10 кілобайт з області HMA і запускається першою (у регістрі DX функції 01h ця програма вказує значення 10240). Друга програма, що запускається, використовує 40 кілобайт і запускається після першої. Очевидно, що друга програма використовує область HMA ефективніше. Але оскільки область HMA вже розподілена першій програмі, друга програма не зможе її використовувати.

Задаючи параметр /HMAMIN=40, ми заборонимо розподіл області HMA тим програмам, які використовують в ній менше 40 кілобайт. Тепер перша програма не дістане доступ до області HMA, навіть якщо вона запускатиметься до другої, використовуючої 40 кілобайт пам'яті з області HMA.

Звільнити область HMA

На вході:       AH = 02h.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки: BL = 80h, 81h, 90h, 93h.

Програми, які просили область HMA, повинні звільнити її з використанням цієї функції. При цьому дані, які знаходилися в цій області, будуть втрачені.

Після того, як програма звільнила область HMA, ця область стає доступною іншим програмам.

Глобальне відкривання лінії A20

На вході:       AH = 03h.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки: BL = 80h, 81h, 82h.

Ця функція призначена для тих програм, які використовуватимуть область HMA. Вона дозволяє роботу заблокованої за умовчанням 21-ої адресної лінії процесора. Перед поверненням управління системі програма повинна закрити лінію A20 за допомогою функції 04h.

Слід зазначити, що на багатьох типах комп'ютерів перемикання лінії A20 - досить повільна операція.

Глобальне закривання лінії A20

На вході:       AH = 04h.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки: BL = 80h, 81h, 82h, 94h.

Функція призначена для тих програм, які використовують область HMA. Вона повинна виконуватися перед завершенням роботи такої програми.

Локальне відкривання лінії A20

На вході:       AH = 05h.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки: BL = 80h, 81h, 82h.

Ця функція призначена тільки для тих програм, які безпосередньо управляють розширеною пам'яттю. Перед завершенням роботи програма повинна закрити лінію A20 за допомогою функції 06h.

Локальне закривання лінії A20

На вході:       AH = 06h.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки: BL = 80h, 81h, 82h, 94h.

Функція відміняє дозвіл лінії A20, запрошений попередньою функцією. Вона призначена тільки для тих програм, які безпосередньо управляють розширеною пам'яттю.

Визначення стану лінії A20

На вході:       AH = 07h.

На виході:      AX = 0001h - якщо лінія A20 відкрита;

               0000                0000h - якщо лінія A20 закрита.

Помилки: BL = 00h, 80h, 81h.

Функція виконує спробу адресуватися за межу 1 мегабайта пам'яті і перевіряє, чи не відбувається при цьому звернення в початок пам'яті (тобто "свертка пам'яті").

Визначення розміру вільної розширеної пам'яті

На вході:       AH = 08h.

На виході:      AX = розмір найбільшого вільного блоку

                               розширеній пам'яті в кілобайтах;

                               DX = загальний розмір вільною розширеною

                               пам'яті в кілобайтах.

Помилки: BL = 80h, 81h, A0h.

При визначенні розміру вільної розширеної пам'яті в повертане значення не включається 64К області HMA, навіть якщо ця область не використовується програмами.

Отримати блок EMB

На вході:       AH = 09h.

                               DX = розмір необхідного блоку в кілобайтах.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка;

                               DX = 16-бітовий індекс (handle) отриманого

                               блоку EMB.

Помилки:         BL = 80h, 81h, A0h, A1h.

Функція замовляє блок EMB з пулу вільної розширеної пам'яті. При успішному виконанні запиту функція повертає індекс отриманого блоку, який повинен використовуватися програмою для виконання усіх операцій з блоком EMB. Якщо блок EMB програмі більше не потрібний, вона повинна звільнити його за допомогою функції 0Ah.

Кількість блоків EMB, яке може бути замовлене, визначається в командному рядку драйвера HIMEM.SYS параметром /NUMHANDLES=. Значення за умовчанням - 32, максимальне значення - 128.

Звільнити блок EMB

На вході:       AH = 0Ah;

                               DX = 16-бітовий індекс (handle) отриманого

                               блоку EMB.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, 81h, A2h, B2h.

Функція звільняє блок EMB, замовлений попередньою функцією. При цьому усі дані, що знаходилися в блоці, будуть втрачені.

Копіювання блоків EMB

На вході:       AH = 0Bh.

                               DS: SI = покажчик на структуру, що управляє

                                               що визначає звідки, куди і як

                                               виконуватиметься копіювання.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, 81h, 82h, A3h, A4h, A5h, A6h, A7h

                               A8h, A9h.

Структура, що управляє, :

ExtMemMoveStruct        struc

 Length         dd ?    ; кількість байтів, що пересилаються

 SourceHandle   dw ?    ; індекс початкового блоку

 SourceOffset   dd ?    ; зміщення в початковому блоці

 DestHandle     dw ?    ; індекс блоку-призначення

 DestOffset     dd ?    ; зміщення в блоці-призначенні

ExtMemMoveStruct        ends

Ця функція виконує основну операцію з блоками EMB - копіювання даних. Дані можуть пересилатися між звичайною пам'яттю і блоками EMB, між різними блоками EMB і навіть усередині звичайної пам'яті.

Поле Length структури, що управляє, вказує кількість байтів, що пересилаються. Ця кількість має бути парною.

Поля SourceHandle і DestHandle вказують, відповідно, індекси початкового і результуючого блоків EMB. Якщо як індекс задано значення 0000h, це означає, що як джерело або приймач даних використовується звичайна пам'ять.

Поля SourceOffset і DestOffset вказують 32-бітове зміщення в блоці EMB або адреса в звичайній пам'яті. У останньому випадку ця адреса має стандартний формат сегмент:смещение.

Функція копіювання сама управляє лінією A20, відновлюючи її стан після виконання копіювання. Тому програмі не вимагається управляти лінією A20.

Під час виконання копіювання дозволені переривання.

Блокування EMB

На вході:       AH = 0Ch;

                               DX = 16-бітовий індекс (handle) того, що блокується

                               EMB.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка;

                               DX: BX = 32-бітова лінійна адреса

                                               заблокованого EMB.

Помилки: BL = 80h, 81h, A2h, ACh, ADh.

Функція блокує EMB і повертає його базову адресу як лінійну 32-розрядну адресу. Для заблокованого EMB неможливо виконати операцію копіювання. Отримана лінійна адреса дійсна тільки для заблокованого EMB.

Розблокування EMB

На вході:       AH = 0Dh;

                               DX = 16-бітовий індекс (handle) разблокируемого

                               EMB.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, 81h, A2h, AAh.

Функція розблоковує EMB, заблокований при виклику попередньої функції. Отримана від неї лінійна адреса стає недійсною.

Отримати інформацію про індекс EMB

На вході:       AH = 0Eh;

                               DX = 16-бітовий індекс (handle) EMB.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка;

                               BH = вміст лічильника блокувань EMB;

                               BL = кількість вільних індексів EMB в

                               системі;

                               DX = розмір блоку в кілобайтах.

Помилки:         BL = 80h, 81h, A2h.

Ця функція використовується для отримання різної інформації про використовувані блоки EMB. Лінійна адреса блоку може бути отримана за допомогою фунции 0Ch.

Змінити розмір EMB

На вході:       AH = 0Fh;

                               DX = 16-бітовий індекс (handle)

                               незаблокованого EMB, розмір

                               якого має бути змінений;

                               BX = новий розмір EMB в кілобайтах.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, 81h, A0h, A1h, A2h, ABh.

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

Запросити область UMB

На вході:       AH = 10h;

                               DX = розмір прошеного блоку UMB

                               у параграфах.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка;

                               BX = сегмент отриманого UMB;

                               DX = розмір отриманого блоку або розмір

                               максимального вільного блоку UMB

                             (якщо неможливо виділити блок

                               необхідного розміру).

Помилки: BL = 80h, B0h, B1h.

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

Якщо вам потрібно визначити розмір доступної області UMB, задайте при виклику цієї функції DX=FFFFh.

Звільнити область UMB

На вході:       AH = 11h;

                               DX = сегмент UMB, що звільняється.

На виході:      AX = 0001h - якщо функція виконана успішно

               0000                0000h - якщо сталася помилка.

Помилки:         BL = 80h, B2h.

Після звільнення блоку EMB дані, які там знаходилися, будуть втрачені.

Коди помилок

Приведемо таблицю кодів помилок, повертаних функціями в регістрі BL, :

Код

Помилка

0000h

Немає помилки, нормальне завершення

80h

Функція не реалізована в поточній версії драйвера

81h

Виявлений драйвер VDISK.SYS, з цим драйвером драйвер HIMEM.SYS несумісний

82h

Помилка при роботі з лінією A20

8Eh

Загальна помилка драйвера

8Fh

Катастрофічна помилка драйвера

90h

Область HMA не існує

91h

Область HMA вже використовується

92h

Вміст регитра DX менше парметра /HMAMIN=

93h

Область HMA не розподілена програмі

94h

Лінія A20 все ще розблокована

A0h

Уся розширена пам'ять вже розподілена

A1h

Більше немає вільних індексів EMB

A2h

Неправильний індекс EMB

A3h

Неправильний SourceHandle

A4h

Неправильний SourceOffset

A5h

Неправильний DestHandle

A6h

Неправильний DestOffset

A7h

Неправильний Length

A8h

Недозволене перекриття даних при виконанні операції пересилки даних

A9h

Сталася помилка парності

AAh

EMB не заблокований

ABh

EMB заблокований

ACh

Переповнювання лічильника блокувань EMB

ADh

Не вдалося виконати блокування EMB

B0h

Доступний UMB меншого розміру

B1h

Немає доступних блоків UMB

B2h

Заданий неправильний сегмент UMB

                                             Індивідуальне завдання.

Провести перевірку наявності драйвера розширеної пам'яті і виконати наступні функції: визначити версію, розблоковувати лінію А20, зажадати, а потім звільнити область HMA.


 

А также другие работы, которые могут Вас заинтересовать

7773. Загальні основи педагогіки вищої школи. організація педагогічного процесу та зміст освіти у вищій школі 533 KB
  Загальні основи педагогіки вищої школи. організація педагогічного процесу та зміст освіти у вищій школі Тема 1. Загальні основи педагогіки вищої школи. система вищої освіти в Україні і закордонні План вивчення теми: Предмет...
7774. Воспитание в Древнем мире. Спарта и Афины 30 KB
  Воспитание в Древнем мире. Спарта и Афины. Обучение и воспитание в Афинах. Утвердить законом тот факт, что ребенка обязаны обучать родители, в Афинах не догадались. Собственного говоря - этого и не требовалось. Общественное мнение, неписанные законы...
7775. Воспитание в Киевской Руси 31 KB
  Воспитание в Киевской Руси Хотелось бы пока остановиться на двух великих произведениях Древней Руси: летопись Повесть временных лет и Поучение Владимира Мономаха. Повесть временных лет определяет место славян и, в частности, русского народа, среди н...
7776. Воспитание в первобытном обществе. Педагогика древних славян 33.5 KB
  Воспитание в первобытном обществе. Педагогика древних славян Воспитание как особый вид  человеческой деятельности появилось в первобытном обществе около  40 - 35  тысяч лет назад. К этому периоду на Земле появляется разумный человек современног...
7777. Воспитание в период раннего феодализма 27.5 KB
  Воспитание в период раннего феодализма. В феодальном обществе господствующими сословиями были светские феодалы и духовенство, владевшие всей землей и эксплуатировавшие подвластных им крестьян. Идеологическим оплотом господствующих групп феодального ...
7778. Гуманистическая теория Песталоцци 36 KB
  Гуманистическая теория Песталоцци Это был народник в лучшем значении слова. Последовательнее всего Песталоцци изложил свои педагогические взгляды в книге: Как Гертруда учит своих детей. Метод обучения по Песталоцци был близок методу Жакото и был н...
7779. Локк Дж. Педагогические взгляды 32 KB
  Дж. Локк Педагогические взгляды Свои педагогические взгляды Локк изложил в книге Мысли о воспитании (1693). Из всех людей, с которыми мы встречаемся, девять десятых являются тем, что они есть - добрыми или злыми, полезными или нет - благо...
7780. Фридрих Адольф Вильгельм Дистервег 31.5 KB
  Дистервег Фридрих Адольф Вильгельм Дистервег - немецкий педагог, прогрессивный либеральный политик. Выступал за секуляризацию школ. Педагогические идеи: Воспитание Дистервег выступал против сословных и национальных ограничений в области образования,...
7781. Древний Рим. Педагогические взгляды Квинтилиана 33.5 KB
  Древний Рим. Педагогические взгляды Квинтилиана. Ведущую роль в формировании личности юного римлянина играло домашнее воспитание. Дети получали религиозное воспитание. При этом отец выполнял функции жреца. Девочки и девушки находились под неусыпным ...