В этой теме хочу поделиться знаниями об ОС MS DOS. Здесь затрону структуры, в которых MS DOS "держит" данные для обращения к файлам, устройствам, а также использует данные для работы с памятью. В этой теме опишу всё кратко, если будет интерес, то могу продолжить.
Для обращения к любой из структур необходимо знать адрес памяти, в которой записаны данные, с этим нам поможет CVT (Code Vector Table) или "Векторная таблица связи", это область памяти, в которой записаны адреса структур MS DOS. Чтобы узнать адрес векторной таблицы связи можно использовать недокументированную функцию DOS 52h.
Код: Выделить всё
mov ah, 52h
int 21h
Теперь приведу ниже структуру векторной таблицы связи.
(-2) dw mcb_seg сегмент первого управляющего блока памяти (MCB)
(0) dd dev_cb указатель на первый блок управления устройствами DOS (DOS Device Control Block)
(+4) dd file_tab указатель на таблицу файлов DOS
(+8) dd clock_dr указатель на драйвер CLOCK$, установленный или резидентный
(+12) dd con_dr указатель на актуальный драйвер CON, установленный или резидентный
------------------------- DOS 2.x -------------------------
(+16) db num_lgdr число логических драйверов в системе
(+17) dw max_btbl максимальное число байт/блоков любого блочного устройства
(+19) dd disk_buf указатель на первый дисковый буфер
(+23) null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS
--------------- DOS 3.x, 4.x----------------
(+16) dw max_btbl максимальное число байт в блоке блочного устройства
(+18) dd disk_buf указатель на первый дисковый буфер
(+22) dd drv_info указатель на массив информации об устройствах
(+26) dd fcb_tabl указатель на таблицу FCB
(+30) dw fcb_size размер таблицы FCB
(+32) db num_bdev число блочных устройств
(+33) db lastdriv значение LASTDRIVE в файле CONFIG.SYS (по умолчанию равно 5)
(+34) null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS
Как можно видеть, в этой области памяти находятся почти все адреса, которые могут понадобиться операционной системе. Для разных версий DOS структура этой области памяти различается, я использовал DOS 6.22.
Теперь кратко опишу основные структуры DOS, адреса которых можно получить из этой области памяти:
1. Самое первое поле со смещением -2 в структуре векторной таблицы связи это сегмент первого MCB (Memory Control Block). Организация памяти в MS DOS такова, что для каждого сегмента, адресованного в MS DOS есть MCB, в структуре которого записаны адрес владельца блока памяти, размер.
2. Следующее поле со смещением 0 в структуре это DDCB (Data or Device Control Block). Каждому дисковому устройству соответствует запись в этой структуре, в ней хранится информация о всех дисковых устройствах в системе, их номера, количество секторов, размер кластера и т.д., в общем, вся информация о дисках.
3. Адрес таблицы файлов MS DOS записана в векторной таблице связи в поле file_tab со смещением +4. В этой структуре таблицы файлов записана информация об "открытых" файлах в операционной системе, каждому файлу соответствует свое число (дескриптор), в структуре файла в этой таблице записаны его место на диске (первый кластер), имя файла, расширение и т.д.. Максимальное количество записей в таблице указывается в файле config.sys в строке FILES=??. Когда необходимо записать что-то в файл, прочитать из него, DOS использует эту структуру.
4. Адрес начала списка драйверов записан в поле null_dr. Это адрес NULL драйвера, он служит для обозначения начала таблицы драйверов, в структуре драйвера записан адрес следующего драйвера, его атрибуты, смещение программы стратегии драйвера и прерывания драйвера.
Я кратко описал основные структуры, которыми пользуется операционная система MS DOS, комментируйте, добавляйте, если я что-то упустил, если есть интерес, могу на практике показать работу с каждой из описанных структур.
Спасибо за внимание!
С уважением, push0ret!