Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+Лабораторная№13 .doc
Скачиваний:
26
Добавлен:
27.10.2018
Размер:
138.24 Кб
Скачать

Лабораторна робота №13.

Тема: Ознайомлення з функціями драйвера EMS.

Ціль: Вивчити здатність роботи з розширеною пам'яттю.

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

На відміну від розширеної пам'яті додаткова пам'ять за допомогою спеціальної апаратури і програмного забезпечення відображується в діапазон адрес, що лежить нижче за межу 1 Мбайт. Такий спосіб придатний для комп'ютерів, що використовують процесор Intel 8086, що не має можливості адресації розширеної пам'яті.

Щоб зрозуміти, як відбувається відображення, згадаємо розподіл першого мегабайта оперативної пам'яті. Область з адресами від 00000 до 9FFFF - це стандартна пам'ять розміром 640К. (Ми використовуємо тут фізичну 20-розрядну адресу). Діапазон адрес від A0000 до BFFFF використовується відеоадаптерами. Нарешті, 256 Кбайтов з адресами C0000 - FFFFF використовується для BIOS.

Проте зазвичай BIOS не займає усе 256 Кбайтов адресного простору, залишаючи "вікна" розміром в десятки кілобайт. За допомогою спеціальної апаратури можна відображувати ці вікна на ділянки додаткової пам'яті, як би "підставляючи" ділянки пам'яті під адреси "вікон".

У практиці побудови обчислювальних систем на основі мікропроцесорів така техніка використовується вже давно. Для комп'ютерів IBM PC/XT/AT корпорації Lotus Development, Intel і Microsoft розробили специфікацію розширеної пам'яті (Expanded Memory Specification - EMS).

У специфікації EMS як вікно для доступу до додаткової пам'яті використовуються 64 кілобайти, розташовані по адресах C0000h, - EFFFFh. Це вікно в специфікації називається "page frame". Вікно розбивається на чотири сегменти по 16 кілобайт. Уся додаткова пам'ять розбивається на логічні сторінки (logical page) розміром по 16 кілобайт. Будь-яка логічна сторінка може бути відображена на будь-який сегмент вікна доступу. Таким чином, використовуючи чотири сегменти, програма може адресуватися одночасно до будь-яких чотирьох логічних сторінок додаткової пам'яті.

На малюнку схематично показано відображення логічних сторінок додаткової пам'яті на сегменти 64-кілобайтного вікна, розташованого в області адрес ПЗП, :

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

Драйвер додаткової пам'яті встановлює вектор переривання INT 67h таким чином, що цей вектор вказує на заголовок драйвера. Для перевірки підключення драйвера ми можемо, отримавши адресу заголовка, порівняти вісім байтів імені пристрою з рядком "EMMXXXX0". При збігу ми можемо вважати, що драйвер додаткової пам'яті встановлений.

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

/*

*.Name ems_init

*.Title Функція перевіряє установку драйвера EMS

*.Descr Ця функція перевіряє наявність драйвера EMS

*.Proto int ems_init(void);

*.Params Не використовуються

*.Return 0 - драйвер EMS встановлений;

* 1 - драйвер EMS не встановлений.

*.Sample ems_test.c

*/

#include <stdio.h>

#include <dos.h>

#include "sysp.h"

int ems_init(void){

void(void);

char _far *EMS_driver_name;

char test_name[8];

int i;

EMS_driver_adr = _dos_getvect(0x67);

FP_SEG(EMS_driver_name) = FP_SEG (EMS_driver_adr);

FP_OFF(EMS_driver_name) = 10;

for(i=0; i<8; i++) test_name[i] = EMS_driver_name[i];

if(strncmp(test_name, "EMMXXXX0", 8) == 0) return(0);

else return(1);

}