Программирование и кодирование
/*
Общие константы спецификации расширенной памяти
*/
#define EMM_INT 0x67 /*программное прерывание
расширенной памяти*/
#define HANDLE_NAME_LENGTH 8 /*кол-во байт в имени об-
работчика*/
#define PAGE_FRAMES 4 /*максимальное кол-во фи-
зических страниц*/
#define PAGE_SIZE 16384 /*кол-во байтов в странице
спецификации расширенной памяти*/
#define EMM_DEVICE "EMMXXXX0" /*имя драйвера устройства
менеджера расширенной памяти*/
#define MAX_HANDLE 255 /*максимальное кол-во обра-
ботчиков менеджера расширенной памяти*/
/*
Константы для кодов состояния спецификации расширенной памяти
*/
#define FRSTEMERR 0x80 /*номер первой ошибки ме-
неджера расширенной памяти*/
#define LASTEMERR 0xA4 /*номер последн. ошибки ме-
неджера расширенной памяти*/
#define FUNCCOK 0x00 /*указанная функция завер-
шилась без ошибок*/
#define EMDRVSWF 0x80 /*программная ошибка драй-
вера менеджера расширенной памяти*/
#define EMDRVHWF 0x81 /*драйвер менеджера расши-
ренной памяти обнаружил ошибку
в аппаратуре*/
#define EMDRVBSY 0x82 /*драйвер менеджера расши-
ренной памяти занят
(других не осталось)*/
#define HANDLNFD 0x83 /*не найден указанный обра-
ботчик*/
#define FUNCCUND 0x84 /*код функции неопределен*/
#define HANDLINS 0x85 /*нет доступных обработчи-
ков*/
#define MAPCXPRO 0x86 /*произошла ошибка восста-
- 7-53 -
новления контекста отображения*/
#define TOTPGINS 0x87 /*не хватает страниц для
запроса*/
#define UNAPGINS 0x88 /*не хватает размещенных
страниц для запроса*/
#define LPAGE2SM 0x89 /*нуль логических страниц
был запрошен от функции, сов-
местимой со спецификацией рас-
ширенной памяти LIM 3.2*/
#define LPAGERNG 0x8A /*логическая страница вне
диапазона указанного обработчика*/
#define PPAGE2BG 0x8B /*физическая страница вне
диапазона*/
#define MRCSAFUL 0x8C /*область сохранения кон-
текста регистров отображения
полна*/
#define MRCSTDUP 0x8D /*у стека контекста регист-
ров отображения уже есть кон-
текст, связанный с указанным обра-
ботчиком*/
#define MRCSTNFD 0x8E /*у стека контекста регист-
ров отображения нет контекста,
связанного с указанным обработ-
чиком*/
#define SFUNCUND 0x8F /*была запрошена неопреде-
ленная подфункция*/
#define ATTRBUND 0x90 /*тип атрибута неопределен*/
#define NVSTGUNS 0x91 /*система не поддерживает не-
разрушаемость*/
#define MREGNOVW 0x92 /*во время передвижки области
произошла частичная перезапись источника*/
#define MRFGN2SM 0x93 /*область спецификации расши-
ренной памяти слишком велика
для указанного обработчи-
ка*/
#define MREGNOVL 0x94 /*область обычной памяти и
область расширенной памяти перек-
рываются*/
#define LPGOF2BG 0x95 /*смещение внутри логической
страницы превышает размер логи-
ческой страницы*/
#define MREGN2BG 0x96 /*длина области превосходит
предел в 1 Мбайт*/
#define MREGNDUP 0x97 /*область-источник и область-
приемник расширенной памяти имеют
один и тот же обработчик и перек-
ры
ваются*/
#define MREGNUND 0x98 /*неопределенный/неподдержи-
ваемый типы памяти-источника и
приемника*/
#define AMRSNFD 0x9A /*указанный альтернативный
набор регистров не существует*/
#define AMDRSINS 0x9B /*все альтернативные наборы
регистров отображения/ПДП заняты*/
#define AMDRSUNS 0x9C /*альтернативные наборы ре-
гистров отображения/ПДП не под-
- 7-54 -
держиваются*/
#define AMDRSUND 0x9D /*указанный альтернативный
набор регистров отображения/ПДП
не определен, не размещен или яв-
ляется текущим набором*/
#define DDMACUNS 0x9E /*назначенные каналы ПДП не
поддерживаются*/
#define DDMACNFD 0x9F /*назначенный указанный ка-
нал ПДП не существует*/
#define HNDVLNFD 0xA0 /*не найдено значение, соот-
ветствующее указанному имени об-
работчика*
/
#define HNDNMDUP 0xA1 /*обработчик с указанным
именем уже существует*/
#define MREGNWRP 0xA2 /*попытка циклического пере-
хода 1-Мбайтного адресного прост-
ранства во время передвижки или
обмена*/
#define USRDSFMT 0xA3 /*содержимое структуры дан-
ных пользователя, переданное
функции искажено или бессмысленно
*/
#define OPSYSACC 0xA4 /*операционная система зап-
рещает доступ к данной функции*/
------------------------------------------------------------------
Листинг 7-3. EMMTYPES.H
------------------------------------------------------------------
/*
Структуры, используемые для связи с менеджером расширенной памяти
*/
#define PCONTEXT unsigned char
#define PMAP unsigned char
typedef struct handle_page { /*структура страницы обработчика*/
unsigned int emm_handle; /*размещенный обработчик
менеджера расширенной памяти*/
unsigned int pages_alloc_to_handle; /*логические страницы
принадлежащие обработчику*/
} HANDLE_PAGE;
typedef struct ppmap { /*структура запроса частичного контекста*/
unsigned int seg_cnt; /*количество отображаемых сег-
ментов, которое требуется получить*/
unsigned int seg_addr[PAGE_FRAMES]; /*адрес отображае-
мого сегмента, который требуется получить*/
} PPMAP;
typedef struct log_to_phys { /*структура отображения логических
на физические страницы*/
unsigned int log_page_no; /*номер логической страницы*/
- 7-55 -
unsigned int phys_page_no; /*номер кадра страниц/адрес
отображаемого сегмента*/
} LOG_TO_PHYS;
typedef struct handle_names { /*элемент массива имен обработчика*/
unsigned int handle_value; /*обработчик*/
char handle_name[HANDLE_NAME_LENGTH]; /*имя, связанное
с обработчиком*/
} HANDLE_NAMES;
typedef struct map_phys_page { /*отображение отображаемого сег-
мента в номер физическ. страницы
*/
unsigned int phys_page_segment; /*адрес сегмента физи-
ческ.
страни-
цы*/
unsigned int phys_page_number; /*номер физическ. страницы*/
} MAP_PHYS_PAGE;
typedef struct hardware_info { /*структура данных об аппаратуре
спецификации расширенной памяти
*/
unsigned int raw_page_size; /*кол-во байт в исх. странице*/
unsigned int alt_reg_sets; /*кол-во альтернативных на-
боров регистров отображения*/
unsigned int ctx_savearea_size; /*кол-во байт в области
сохранения контекста*/
unsigned int dma_reg_sets; /*кол-во наборов рег-ров
ПДП*/
unsigned int dma_chan_op; /*0: работа ПДП по
станд. LIM,
1: только один канал ПДП*/