Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книга 3, М.: Диалог-МИФИ, 1992. 1.5. Функции BIOS для работы с дискамиНаилучшим и самым безопасным способом работы с дисками на физическом уровне является использование функций BIOS. Эти функции учитывают все особенности аппаратуры и предоставляют достаточно широкий набор средств доступа к дискам на физическом уровне. Вся дисковая подсистема обслуживается прерыванием BIOS INT 13h. Это прерывание выполняет множество функций. Для вызова определенной функции программа должна занести ее код в регистр AH, другие регистры, как правило, должны содержать параметры - номера используемых дисководов, цилиндров, головок, адреса таблиц параметров дискеты и жесткого диска и т.д. Библиотека транслятора Microsoft QC 2.5 содержит специальную функцию _bios_disk(), сильно упрощающую работу с дисковыми функциями BIOS. В примерах программ, приведенных в книге, мы продемонстрируем как непосредственный вызов прерывания INT 13h, так и использование функции _bios_disk(). Мы приведем краткую таблицу функций прерывания INT 13h, после чего займемся детальным описанием этих функций. В примечании к описанию функций мы будем указывать типы компьютеров, на которых данная функция работоспособна.
1.5.1 Сброс дисковой подсистемы
Эта функция вызывает сброс и рекалибровку дискового контроллера (головки устанавливаются на нулевой цилиндр). Если в адресе дисковода старший бит (бит 7) установлен в 1, выполняется сброс контроллера НМД. Сброс рекомендуется выполнять после того, как произошла ошибка при выполнении других операций, таких как чтение или запись. После сброса можно попытаться повторить операцию. Адрес дисковода 0 соответствует первому флоппи-диску (A:), 1 - второму (B:) и т.д. Адреса 80, 81 соответствуют первому и второму физическим накопителям на жестком магнитном диске. 1.5.2 Получить состояние дисковой подсистемы
Эта функция может быть использована для анализа результата выполнения дисковой операции и получения кода ошибки. Передаваемый в регистре AL код ошибки функция берет из области данных BIOS - из байта с адресом 0000:0441h. Код ошибки может принимать следующие значения:
1.5.3 Чтение сектора
Эта функция позволяет прочитать один или несколько секторов диска в буфер, находящийся в оперативной памяти. Вам надо задать для начального сектора номера дорожки, головки и номер самого сектора. Для НМД номер дорожки и сектора задаются следующим образом: биты регистра CX 5...0 задают номер сектора, а биты 15...6 - номер дорожки. Перед чтением необходимо подготовить таблицу параметров дискеты или диска (для операций с НМД). 1.5.4 Запись сектора
Функция записи секторов аналогична предыдущей, за исключением направления перемещения данных - данные записываются из буфера в сектора диска. Необходимо отметить, что при работе с НГМД не всякий BIOS будет ожидать разгона двигателя до рабочей скорости перед выполнением операции записи. В результате программа может получить признак ошибки. Прежде чем делать вывод о причинах ошибки, следует сбросить контроллер НГМД функцией 00H и повторить операцию записи три раза. 1.5.5 Проверка сектора
С помощью этой функции можно убедиться, что указанные сектора существуют и их можно прочесть. Данные проверяются по методу циклического избыточного контроля (CRC). Адрес буфера не нужен, так как чтения данных в оперативную память при проверке секторов не происходит. Если вы используете компьютер со старой BIOS, выпущенной ранее 11/15/85, регистры ES:BX должны указывать на буфер соответствующего размера, как и при выполнении операции чтения. Перед использованием этой функции убедитесь, что мотор НГМД раскрутился до рабочей скорости, в противном случае вы получите признак ошибки. 1.5.6 Форматирование дорожки
Функция форматирования предназначена для начального формирования структуры дорожки диска, она разрушает все имеющиеся на дорожке данные. С помощью функции 05 вы можете за один раз отформатировать только одну дорожку с указанным номером. Для этой функции необходимо задать два интересных параметра, на которых мы остановимся подробнее - фактор чередования и буфер формата. Что такое фактор чередования (Interleave)? Этот фактор определяет последовательность расположения секторов на дорожке. Сектора могут располагаться в порядке своих номеров, через один, через два и т.д. Способ размещения секторов определяется значением фактора чередования. Фактор 1 означает последовательное расположение секторов на дорожке в порядке их номеров, т.е. чередование отсутствует. Фактор 2 задает расположение секторов через один, 3 - через два и т.д. На рисунке показано использование фактора чередования при форматировании дорожки:
Все утилиты, предназначенные для подготовки жесткого диска к работе, требуют задания величины фактора чередования при выполнении низкоуровневого форматирования. Для чего может понадобиться несмежное расположение секторов с последовательными номерами на дорожке диска? При последовательном расположении секторов может получиться так, что процессор не будет успевать обрабатывать смежные сектора за один проход дорожки. Например, программа считывает последовательно второй и третий сектор. В момент времени, когда второй сектор уже считан, при быстром вращении диска к моменту начала чтения третьего сектора головки могут оказаться в середине третьего сектора и диск совершит еще один оборот, прежде чем головки окажутся в начале третьего сектора. Поэтому если программа последовательно обращается к смежным секторам, может получиться так, что при чтении каждого сектора диск будет совершать один оборот. Если же сектора будут расположены через один или через два, количество оборотов диска, нужных для обработки последовательности смежных секторов, будет значительно меньше. Для подбора оптимального фактора чередования можно использовать специальные программы или делать это методом проб и ошибок, задавая каждый раз новое значение фактора и проверяя быстродействие диска. Займемся теперь буфером формата. Перед вызовом функции форматирования регистры
ES:BX должны содержать полный адрес буфера формата.
Для дискет перед форматированием этот буфер
должен представлять из себя заполненный массив
четырехбайтовых элементов - номера дорожки,
головки, сектора и кода размера сектора. Код
размера сектора может иметь следующие значения:
Количество элементов в массиве должно быть равно количеству создаваемых на дорожке секторов, то есть для каждого сектора буфер формата должен содержать один описывающий его четырехбайтовый элемент. Для жесткого диска буфер формата должен представлять из себя массив размером 512 байтов. В начале этого массива для каждого сектора на дорожке необходимо подготовить двухбайтовые элементы. Первый байт содержит признак - хороший это сектор (00) или плохой (80h). Второй байт - это номер сектора. Задавая последовательность номеров в буфере формата соответствующим образом, программа определяет фактор чередования. Приведем пример подготовленного буфера формата для форматирования дорожки на 17 секторов с фактором чередования, равным 2: db 00h,01h,00h,0ah,00h,02h,00h,0bh,00h,03h,00h,0ch db 00h,04h,00h,0dh,00h,05h,00h,0eh,00h,06h,00h,0fh db 00h,07h,00h,10h,00h,08h,00h,11h,00h,09h Отметим, что буфер формата используется только для машин AT. Машины XT при форматировании НМД не используют буфер формата, вместо этого значение фактора чередования указывается при вызове функции форматирования в регистре AL. При форматировании флоппи-дисков с помощью этой функции таблица параметров дискеты должна содержать правильное значение количества секторов на дорожке и другие параметры. 1.5.7 Форматирование дорожки (НМД)
Функция форматирования дорожки с кодом 6 предназначена только для НМД и устанавливает флаг плохого сектора. Буфер формата подготавливается аналогично функции 5. 1.5.8 Форматирование диска (НМД)
Функция форматирования с кодом 7 предназначена для форматирования целого диска начиная с определенной дорожки. Буфер формата подготавливается аналогично функции 5. 1.5.9 Получить текущие параметры дисковода (НМД)
С помощью этой функции программа может
определить тип дисковода, количество дисководов,
обслуживаемых первым дисковым контроллером и
другие параметры дисковода, которые нужны
программе для организации доступа к диску на
физическом уровне. Тип дисковода, возвращаемый в
регистре BL, может принимать следующие значения:
1.5.10 Инициализация контроллера НМД
Функцию инициализации контроллера НМД применяют после модификации таблиц параметров жесткого диска. BIOS BIOSузнает о внесенных в таблицы изменениях и инициализирует соответствующим образом контроллер НМД. 1.5.11 Чтение секторов длинное (НМД)
Функция "Чтение секторов длинное" отличается от обычной функции чтения (код 02h) тем, что она дополнительно считывает в буфер данных 4 байта кода коррекции ошибки (ECC). 1.5.12 Запись секторов длинная (НМД)
Функция "Запись секторов длинная" отличается от обычной функции записи (код 03h) тем, что она дополнительно записывает на диск из буфера данных 4 байта кода коррекции ошибки (ECC). 1.5.13 Поиск дорожки (НМД)
С помощью функции 0Ch программа может подвести головки к дорожке с заданным номером. Функции чтения/записи секторов не требуют предварительного поиска дорожки, они выполняют поиск сами. 1.5.14 Альтернативный сброс дисковода (НМД)
Вы можете использовать эту функцию для сброса контроллера вместо функции с кодом 00h. В отличие от функции сброса дисковой подсистемы с кодом 00h эта функция не влияет на контроллер НГМД, она сбрасывает только контроллер накопителя на жестком магнитном диске. 1.5.15 Чтение буфера сектора (НМД)
Контроллеры НМД в компьютерах PC и XT содержат внутренний буфер данных. С помощью функции 0Eh программа может прочитать содержимое этого буфера в оперативную память. Чтения данных с диска при этом не происходит. В основном функция чтения буфера используется для диагностики дискового контроллера. 1.5.16 Запись буфера сектора (НМД)
Функция полностью аналогична предыдущей, за исключением того, что происходит не чтение, а запись данных из оперативной памяти в буфер контроллера. Она может быть использована для инициализации содержимого буфера сектора перед форматированием диска функцией 05h прерывания INT 13h. 1.5.17 Получить состояние дисковода (НМД)
О готовности дисковода можно судить по байту состояния, передаваемому функцией в регистре AH. Этот байт аналогичен возвращаемому в регистре AH функцией 01h. 1.5.18 Рекалибровка дисковода (НМД)
Вызов функции приводит к позиционированию головок выбранного дисковода на нулевую дорожку. Дополнительно в регистре AH возвращается байт состояния дисковода. 1.5.19 Проверка памяти контроллера (НМД)
Эта функция предназначена для запуска встроенной диагностики дискового контроллера, она проверяет внутренний буфер сектора и возвращает байт состояния. 1.5.20 Проверка дисковода (НМД)
Функция используется для запуска внутренней диагностики контроллера. 1.5.21 Проверка контроллера (НМД)
Функция запускает внутреннюю диагностику контроллера. 1.5.22 Получить тип дисковода
Возвращаемый этой функцией тип дисковода может принимать следующие значения:
С помощью этой функции программа может определить тип диска и возможность обнаружения замены магнитного носителя (дискеты). 1.5.23 Проверка замены диска
В некоторых случаях замена дискеты нежелательна до выполнения определенных действий (мы говорили об этом при обсуждении драйверов дисковых устройств). С помощью этой функции программа может убедиться в том, что в дисководе установлена все та же дискета, что и в начале цикла операций. Если дискета была по ошибке заменена раньше времени, программа может потребовать установить старую дискету для завершения работы с ней. 1.5.24 Установка типа дискеты
Функцию установки типа дискеты необходимо использовать перед началом работы с дискетой. Устанавливаемый тип может принимать следующие значения:
Если перед вызовом этой функции был установлен флаг замены дискеты, то он сбрасывается. Дополнительно BIOS BIOSустанавливает скорость передачи данных через контроллер НГМД в зависимости от типа дискеты. 1.5.25 Установка среды для форматирования (НГМД)
Эта функция должна быть вызвана перед использованием функции 05h форматирования диска для установки правильной скорости передачи данных через дисковый контроллер. Дополнительно функция сбрасывает флаг замены дискеты (если этот флаг установлен). 1.5.26 Парковка головок (НМД)
Парковка головок - это их установка в нерабочую область, т.е. на нерабочую дорожку. Эту операцию обычно выполняют перед транспортировкой компьютера для исключения повреждения дисковода. 1.5.27 Форматирование диска (ESDI НМД)
Эта функция форматирования жесткого диска предназначена для НМД, используемого совместно с контроллером ESDI. Она поддерживает таблицу дефектных дорожек и имеет несколько режимов форматирования в зависимости от содержимого регистра CL при вызове:
Если при форматировании затребована функция генерации периодических прерываний, то после форматирования каждой дорожки вызывается прерывание INT 5h с регистром AH=0Fh. Это прерывание можно использовать для индикации хода процесса либо для завершения процесса форматирования по требованию оператора или программы. При установке бита 2 регистра CL содержимое вторичной таблицы дефектов обновляется, в нее заносятся результаты тестирования диска. Для углубленного анализа поверхности диска сначала необходимо выполнить форматирование диска с битом 3, сброшенным в 0. Затем следует выполнить анализ поверхности диска, вызвав эту функцию с битом 3, установленным в 1. |