Исследование цепочки блоков основной памяти
MCB это управляющий блок, который DOS использует при распределении, модификации и освобождении блоков системной памяти.
Формат блока:
Смещ. Длина Содержимое
▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
┌───┐ ┌──► 'M'(4dH) — за этим блоком есть еще блоки
+0 1 │Тип├──┴──► 'Z'(5aH) — данный блок является последним
├───┴───┐
+1 2 │Владелец параграф владельца (для FreeMem); 0 = владеет собой
├───┴───┤
+3 2 │Размер │ число параграфов в этом блоке распределения
├───┴───┴───────┐
+5 3 │зарезервировано│
└───┴───┴───-───┘
+8 8 ASCIIZ имя хозяина
+10H? Блок памяти начинается здесь и имеет длину (Размер*10H) байт.
Замечания:
блоки памяти всегда выровнены на границу параграфа («сегмент_блока»);
блоки M-типа: следующий блок находится по (сегмент_блока+Размер):0000;
блоки Z-типа: (сегмент_блока+Размер):0000 = конец памяти.
Сегмент первого блока в цепочке MCB-блоков хранится по смещению -2 в таблице таблиц (векторной таблице связи) MS-DOS. В векторной таблице связи есть полезная информация, открывающая доступ практически ко всем внутренним структурам данных операционной системы.
Таблица 1 Формат векторной таблицы связи
Смещение, байт Размер, байт Имя поля Описание
— 2 2 mcb_seg Сегмент первого блока памяти MCB
0 4 dev_cb Указатель на первый блок управления устройствами MS-DOS (MS-DOS Device Control Block)
4 4 file_tab Указатель на таблицу файлов MS-DOS
8 4 clock_dr Указатель на драйвер CLOCK$, установленный в файле config. sys или резидентный
12 4 con_dr Указатель на драйвер CON, установленный в файле config. sys или резидентный
16 2 max_btbl Максимальный размер блока (в байтах) для устройства, выполняющего передачу данных отдельными блоками
18 4 disk_buf Указатель на структуру, описывающую дисковые буферы
22 4 drv_info Указатель на массив информации об устройствах
26 4 fcb_tabl Указатель на таблицу FCB
30 2 fcb_size Размер таблицы FCB
32 1 num_bdev Число устройств, выполняющих передачу данных отдельными блоками
33 1 lastdriv Значение LASTDRIVE в файле config. sys (по умолчанию равно 5)
34? null_dr Начало драйвера NUL. Этот драйвер всегда первый в списке драйверов MS-DOS
Предварительно загрузив резидентную программу PEEK. EXE для просмотра содержимого памяти, определим с помощью утилиты LOL.COM адрес начала таблицы таблиц:
List of list location: 00A7:0026H
По смещению -2 находится адрес сегмента, по которому расположен первый MCB в цепочке блоков основной памяти. В данном случае этот адрес равен 0213:0000