Для правильной работы с дисками на физическом уровне программа должна располагать существенно большей информацией о дисках, чем просто номер нужной дорожки или головки. Например, она должна знать, сколько головок и сколько дорожек имеет то или иное дисковое устройство, сколько байт содержится в одном секторе и многое другое.
Глава 3. Работа с дисками на физическом уровне.
Прежде чем начать работу с дисками на физическом уровне, необходимо выяснить конфигурацию дисковой системы - сколько дисководов и какого типа подключено к компьютеру, сколько дорожек и головок имеется на каждом из дисководов и т. д. Способ, которым определяется конфигурация дисковой системы, зависит от модели компьютера (PC, XT, AT), поэтому вначале займемся определением типа персонального компьютера.
3.1 Определение типа компьютера.
ПЗУ базовой системы ввода/вывода BIOS содержит по адресу FFFFh:FFFEh байт конфигурации, значение которого можно использовать для идентификации типа компьютера:
Значение | Тип компьютера |
FFh | Оригинальный IBM PC |
FEh | IBM PC/XT, Portable PC |
FDh | PCjr |
FCh | IBM PC/AT |
FBh | IBM PC/XT с памятью 640 Кбайт на материнской плате |
F9h | Convertible PC |
Для компьютеров IBM PC и IBM PC/XT конфигурация дисковой системы определяется установкой переключателей на основной плате, в частности, переключателями устанавливается количество подключенных к системе НГМД.
Компьютеры IBM PC/AT (и более высокого класса) имеют на основной плате CMOS-память с малым энергопотреблением, которая питается от аккумулятора. В CMOS-памяти хранится информация о конфигурации дисковой системы. В процессе инициализации BIOS считывает эту информацию и записывает ее в свою внутреннюю область данных.
Проанализировав значение байта конфигурации, можно сделать предварительное заключение о составе дисковой системы компьютера. Если оно равно FFh, FDh, F9h, то наш компьютер не имеет НМД - это одна из разновидностей IBM PC. Значения FEh, FBh могут соответствовать IBM PC/XT и совместимым с ним компьютерам. Такие компьютеры могут быть оборудованы НМД. И, наконец, значение FCh соответствует IBM PC/AT. Для этого компьютера конфигурация дисковой системы должна определяться исходя из содержимого CMOS-памяти.
3.2 Прерывание INT 11h.
Прерывание базовой системы ввода/вывода INT 11h возвращает в регистре AX байт конфигурации системы, который можно использовать для определения количества НГМД и наличия НМД. Самый младший бит байта конфигурации (бит 0) - признак наличия в системе НМД. Если этот бит установлен в 1, то компьютер оборудован НМД, иначе дисковая система состоит только из накопителей на гибких магнитных дисках.
Биты 7 и 6 содержат информацию о количестве НГМД:
Содержимое бит 7 и 6 | Количество установленных НГМД |
00 | 1 |
01 | 2 |
10 | 3 |
11 | 4 |
Это прерывание лучше всего использовать для IBM PC/XT и IBM PC. Для IBM PC/AT необходимо исследовать содержимое CMOS-памяти. Займемся этим.
3.3 Анализ содержимого CMOS-памяти.
Программа не может непосредственно адресовать CMOS-память, как обычную оперативную память. Для работы с CMOS-памятью необходимо использовать порты ввода/вывода с адресами 70h и 71h, причем процедура записи или чтения состоит из двух шагов.
На первом шаге операции чтения или записи программа должна записать в порт 70h номер нужной ячейки CMOS-памяти (0...3Fh). На втором шаге программа должна обратиться к порту 71h для выполнения записи в указанную ячейку памяти или чтения из нее.
Приведем фрагмент программы, составленной на языке ассемблера, который считывает байт из CMOS-памяти с адресом 12h:
mov al,12h
out 70h,al ; задаем адрес в CMOS-памяти
jmp $+2 ; небольшая задержка
in al,71h ; записываем в AL считанное значение
Запись в CMOS-память выполняется аналогично.
При анализе конфигурации дисковой системы для нас представляют наибольший интерес ячейки CMOS-памяти со следующими адресами:
• 14h - байт конфигурации
Биты 7, 6 этого байта имеют такое же значение, что и в младшем байте слова конфигурации, возвращаемого прерыванием INT 11h - они содержат информацию о количестве установленных в компьютере НГМД.
Значение бита 0, равное нулю, говорит о том, что в системе нет ни одного НГМД.
• 10h - тип НГМД
Младшая и старшая тетрады этого байта описывают, соответственно, второй и первый НГМД:
Значение | Емкость, Кбайт | Диаметр | Количество секторов на одну дорожку | Количество дорожек |
0000 | НГМД не установлен | - | - | - |
0001 | 360 | 5,25" | 9 | 40 |
0010 | 1200 | 5,25" | 15 | 80 |
0011 | 720 | 3,5" | 9 | 40 |
0100 | 1440 | 3,5" | 18 | 80 |
• 12h - тип НМД C: и D:
Этот байт разделен на две тетрады аналогично байту, который описывает НГМД. Однако в тетраде можно закодировать только 16 значений, а различных типов НМД значительно больше. Поэтому тип 15 используется специальным образом - если тип НМД в младшей тетраде (диск C:) равен 15, то правильное значение типа находится в CMOS-памяти по адресу 19h. Аналогично для диска D: этот тип можно взять из байта по адресу 1Ah (если содержимое старшей тетрады байта с адресом 12h равно 15).
Если в вашем компьютере установлен НМД с интерфейсом ESDI , SCSI или другим специализированным интерфейсом, то, как правило, для работы с ними используется специальная "дисковая" базовая система ввода/вывода. Соответствующая микросхема ПЗУ может быть расположена непосредственно в контроллере. При этом в CMOS-памяти в ячейке 12h для типа диска может быть указано нулевое значение, несмотря на то, что диск установлен. Прерывание INT 11h , тем не менее, скажет вам, что в системе имеется НМД.
Если используется "дисковая" базовая система ввода/вывода, то она сама инициализирует таблицу параметров диска (будет описана позже) и выполняет обработку прерывания INT 13h . Так как MS-DOS при обращении к дискам использует именно это прерывание, то не возникает никаких проблем, связанных с отсутствием типа диска в CMOS-памяти. Другие операционные системы, такие как Windows NT и OS/2 , используют для работы с дисками специальные драйверы.
3.4 Таблицы параметров НМД и НГМД.
Для работы с диском на физическом уровне необходимо знать такие его характеристики, как количество головок, секторов и др. Эти характеристики можно определить из таблиц параметров НГМД и НМД, заполняемых BIOS в процессе инициализации системы.
Анализируя содержимое CMOS-памяти в компьютерах IBM PC/AT или установку переключателей конфигурации на основной плате в компьютерах IBM PC и IBM PC/XT, BIOS в процессе инициализации создает таблицу параметров дискеты DPT (DisketteParameterTable), а также одну или две таблицы параметров жесткого диска HDPT (HardDiskParameterTable). Если имеется специальная "дисковая" система ввода/вывода, то она сама создает таблицы HDPT.
Таблица параметров дискеты DPT имеет длину 10 байт, ее адрес располагается в области данных BIOS по адресу 0000h:0078h, что соответствует вектору прерывания INT 1Eh . Таблица содержит следующие параметры:
Смещение, байт | Размер, байт | Имя поля | Описание |
0 | 1 | srt_hut | Биты 0...3:SRT (Step Rate Time) - задержка для переключения головок, лежит в пределах 1 - 16 мс и задается с интервалом 1 мс (0Fh - 1 мс, 0Eh - 2 мс, 0Dh - 3 мс, ...).Биты 4...7:Задержка разгрузки головки, лежит в пределах 16 - 240 мс и задается с интервалом 16 мс (1 - 16 мс, 2 - 32 мс, ..., 0Fh - 240 mc) |
1 | 1 | dma_hlt | Бит 0:Значение этого бита, равное 1, говорит о том, что используется прямой доступ к памяти; Биты 2...7:Время загрузки головок HLT - интервал между сигналом загрузки головок и началом операции чтения или записи, лежит в пределах 2 - 254 мс и задается с интервалом 2 мс (1 - 2 мс, 2 - 4 мс, ..., 0FFh - 254 мс) |
2 | 1 | motor_w | Задержка перед выключением двигателя |
3 | 1 | sec_size | Код размера сектора в байтах:0 - 128;1 - 256;2 - 512;3 - 1024 |
4 | 1 | eot | Номер последнего сектора на дорожке |
5 | 1 | gap_rw | Длина межсекторного промежутка для чтения или записи |
6 | 1 | dtl | Максимальная длина передаваемых данных. Используется, когда не задана длина сектора |
7 | 1 | gap_f | Длина межсекторного промежутка для операции форматирования |
8 | 1 | fill_char | Байт-заполнитель для форматирования, обычно используется F6h |
9 | 1 | hst | Время установки головки в мс |
10 | 1 | mot_start | Время запуска двигателя в 1/8 долях секунды |
Все времена зависят от частоты тактового генератора контроллера НГМД, приведенные значения соответствуют частоте 8 МГц.
Адреса таблиц параметров жестких дисков HDPT расположены по адресам, соответствующим векторам прерываний INT 41h (для первого физического диска) и INT 46h (для второго физического диска). Эти таблицы имеют следующий формат:
Смещение, байт | Размер, байт | Имя поля | Описание |
0 | 2 | max_cyl | Максимальное количество дорожек на диске |
2 | 1 | max_head | Максимальное количество магнитных головок |
3 | 2 | srwcc | Начальная дорожка для предварительной записи (Starting reduced-write current cylinder) |
5 | 2 | swpc | Начальная дорожка для предварительной компенсации при записи (Starting write precompensation cylinder) |
7 | 1 | max_ecc | Максимальная длина блока коррекции ошибок ECC (Maximum ECC data burst length) |
8 | 1 | dstopt | Параметры устройства: бит 7 - запрет восстановления; бит 6 - запрет восстановления по блоку коррекции ошибок ECC (Error Correction Code); биты 2-0 - дополнительные параметры устройства |
9 | 1 | st_del | Стандартная величина задержки |
10 | 1 | fm_del | Величина задержки для форматирования диска |
11 | 1 | chk_del | Величина задержки для проверки диска |
12 | 4 | reserve | Зарезервировано |
Таблица параметров жесткого диска содержит такие важнейшие значения, как максимальное количество дорожек и максимальное количество головок. Если вам не удалось определить тип диска, то таблица HDPT - единственное надежное место, откуда можно получить информацию о количестве дорожек и головок.