Системное программное обеспечение персональных ЭВМ


Пример 16



Пример 16

struct BCB { /* BCB DOS 4.0 и далее */ word next; /* смещение следующего */ word prev; /* смещение предыдущего */ byte drive; byte flag; dword sect; byte copies; word sect_off; void *dpb; word count; /* счетчик обращений */ byte reserved[1]; };

Поля drive и sect включают логический номер диска и номер сектора этого диска, содержимое которого скопировано в данный буфер (в ни разу не использованных буферах drive=0xff), поле dpb - ссылку на DPB этого устройства. Поле состояния буфера - flag - будет нами рассмотрено ниже. Поле copies содержит число копий данного сектора на диске (оно отлично от 1 только для секторов, входящих в состав FAT), а поле sect_off - смещение на диске второй копии относительно первой (в секторах).

Все BCB связаны в список, но организация списка различна для разных версий DOS. В DOS 3 начальный адрес этого списка находится в CVT со смещением 0x12 от адреса, возвращаемого функцией 0x52. Каждый элемент списка в поле next содержит адрес (сегмент и смещение) следующего элемента. Признаком конца списка является значение 0xFFFF в смещении адреса следующего элемента.

В DOS 5 все буфера расположены в одном сегменте памяти. Поля next и prev в BCB связывают их в двухсвязный список. Эти поля содержат только смещения, так как сегментный адрес у всех буферов один и тот же. Для этой версии поле CVT со смещением 0x12 включает адрес области памяти, в которой хранится адрес начала списка, для выхода на первый элемент списка необходима двойная адресация. Список - кольцевой, то есть поле next его последнего элемента указывает на первый элемент, а поле prev первого - на последний.

Теперь об интерпретации разрядов байта состояния буфера. Наши эксперименты подтверждают следующие назначения его битов:




- Начало -  - Назад -  - Вперед -