Таблица связи управляющих блоков MSDOS



2.1. Таблица связи управляющих блоков MS-DOS

Операционная система MS-DOS, подобно операционным системам для больших ЭВМ серии ЕС, содержит векторную таблицу связи основных управляющих блоков. К сожалению, в руководстве по MS-DOS ничего не говорится об этой таблице. Мы попытаемся в некоторой степени восполнить этот пробел, так как изучение векторной таблицы связи позволит глубже осознать принципы работы операционной системы. Информация из векторной таблицы связи будет полезной для составления программ отображения распределения памяти, вывода списка загруженных драйверов, списка устройств прямого доступа и т.д.

Для получения адреса векторной таблицы связи можно воспользоваться недокументированной внутренней функцией 52h прерывания 21h. Для версий MS-DOS 2.х, 3.х, 4.00, 4.01 и 5.0 после вызова этой функции регистры ES:BX будут содержать искомый адрес. Так как описание этой функции отсутствует в руководстве по MS-DOS, в следующих версиях операционной системы возможно придется искать другой способ получения адреса векторной таблицы связи. Может также измениться формат этой таблицы.

Функции для получения адреса векторной таблицы связи: ;** ;.Name get_cvt ; ;.Title Получить адрес векторной таблицы связи ; ;.Descr Функция возвращает адрес векторной таблицы связи ; в регистрах ES:BX для DOS версий 2.х, 3.х, 4.00, ; 4.01 ; ;.Params Нет ; ;.Return ES - сегмент векторной таблицы связи, ; BX - смещение векторной таблицы связи ;** PUBLIC get_cvt .MODEL tiny .CODE get_cvt proc near mov ax,5200h int 21h ret get_cvt endp end /** *.Name get_cvt * *.Title Получить адрес векторной таблицы связи * *.Descr Функция возвращает адрес векторной таблицы связи * для DOS версий 2.х, 3.х, 4.00, 4.01 * *.Params Нет * *.Return Указатель на векторную таблицу связи **/ #include <dos.h> #include <stdio.h> #include "sysp.h" void far *get_cvt(void) { union REGS inregs, outregs; struct SREGS segregs; inregs.h.ah = 0x52; intdosx( &inregs, &outregs, &segregs ); return(FP_MAKE(segregs.es,outregs.x.bx)); }

В примере на языке Ассемблера процедура get_cvt вызывает функцию 52h прерывания 21h, после чего возвращает адрес векторной таблицы связи в регистрах ES:BX.



Функция get_cvt, составленная на языке Си, также вызывает это прерывание, пользуясь функцией intdosx стандартной библиотеки транслятора. Функция intdosx вызывает прерывание 21h. В качестве параметров ей передаются адреса структур и объединения inregs, outregs и segregs. Объединение inregs должно содержать значения регистров перед вызовом прерывания, в объединение outregs и структуру segregs заносятся значения регистров общего назначения и сегментных регистров после того, как завершится обработка прерывания.

Подробнее об этом сказано в описании стандартной библиотеки.

Макро FP_MAKE описано в файле sysp.h и предназначено для конструирования FAR-указателя из значений сегмента и смещения: #define FP_MAKE(seg,off) ((void far *) \ ((((unsigned long) (unsigned)(seg)) << 16L) | \ ((unsigned long) (unsigned) (off))))

Следующая программа, составленная на языке Си, выводит на консоль адрес векторной таблицы связи: #include <stdio.h> #include "sysp.h" void main(void) { void far *cvt; cvt=get_cvt(); printf("Адрес векторной таблицы связи: %Fp\n",cvt); exit(0); }

Спецификация формата вывода %Fp используется для вывода значения указателя типа FAR.

Описание векторной таблицы связи, а также других управляющих блоков будет состоять из строк следующего вида: (+4) 4 filename_ptr - указатель на имя файла

В этой строке: (+4) - смещение поля в управляющем поле в байтах; 4 - длина поля в байтах; filename - имя поля.

Вслед за именем идет краткое описание содержимого поля.

Итак, векторная таблица связи MS/DOS:



Содержание раздела