
Часть 2. Исследование особенностей работы дисковой подсистемы
2.2. Изучение влияния параметра sk в командах "Чтение данных" и "Чтение
удаленных данных":
А) Выполнить команду "Запись данных" для сектора 3 дорожки 1.
Командная фаза:
MT MFM
КОП1: 0 1 000101
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0 – номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000001 – Номер дорожки (1)
Н: 00000000 – Номер головки (0)
R: 00000011 – Номер сектора (3)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Байты результата:
ST0 = 00000000 - регистр состояния КГД
ST1 = 00000000 - регистр состояния КГД
ST2 = 00000000 - регистр состояния КГД
//нулевые значения этих регистров говорят о том, что операция записи завершена успешно
C = 00000001 – номер дорожки (1)
H = 00000000 – номер головки (0)
R = 00000100 – номер сектора (4)
//мы записали данные в 3 и автоматически головка переместилась на следующий сектор (4)
N = 00000010 – код размера сектора (02 – 512 байт - стандартно)
б) Выполнить команду "Чтение данных" при SK=0 и SK=1.
1) SK = 0
Командная фаза:
MT MFM SK
КОП1: 0 1 0 00110
// SK – SKIP – пропуск данных, не соответствующих типу команды чтения.
В данном случае мы производим чтение данных и SK=0, что означает, что мы будем читать любые данные: и обычные, и удаленные.
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0 – номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000001 – Номер дорожки (1)
Н: 00000000 – Номер головки (0)
R: 00000011 – Номер сектора (3)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Байты результата:
Чтение завершено успешно, записанные данные отобразились на экране
2) SK = 1
Командная фаза:
MT MFM SK
КОП1: 0 1 1 00110
// SK – SKIP – пропуск данных, не соответствующих типу команды чтения.
В данном случае мы производим чтение данных и SK=1, что означает, что мы будем читать обычные данные и пропускать удаленные.
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0 – номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000111 – Номер дорожки (7)
Н: 00000000 – Номер головки (0)
R: 00000111 – Номер сектора (7)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Байты результата:
Аналогично предыдущему пункту – чтение завершено успешно, записанные данные отобразились на экране, т.к. это обычные данные и читаем мы тоже обычные данные.
в) Выполнить команду "Чтение удаленных данных" при SK=0 и SK=1.
1) SK = 0
Командная фаза:
MT MFM SK
КОП1: 0 1 0 01100
// SK – SKIP – пропуск данных, не соответствующих типу команды чтения.
В данном случае мы производим чтение удаленных данных, а данные на самом деле обычные, но т.к. SK=0, то мы будем читать любые данные: и обычные, и удаленные.
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0 – номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000001 – Номер дорожки (1)
Н: 00000000 – Номер головки (0)
R: 00000011 – Номер сектора (3)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Байты результата:
ST0 = 00000000 - регистр состояния КГД
ST1 = 00000000 - регистр состояния КГД
ST2 = 01000000 - регистр состояния КГД
Бит СМ (ST2.6) имеет единичное значение, что означает, что во время операции чтения обнаружен сектор с маркером удаленных данных.
C = 00000001 – номер дорожки (1)
H = 00000000 – номер головки (0)
R = 00000011 – номер сектора (3)
N = 00000010 – код размера сектора (02 – 512 байт - стандартно)
Чтение завершено успешно, записанные данные отобразились на экране
2) SK = 1
Командная фаза:
MT MFM SK
КОП1: 0 1 1 01100
// SK – SKIP – пропуск данных, не соответствующих типу команды чтения.
В данном случае мы производим чтение удаленных данных, а данные на самом деле обычные и т.к. SK=1, то мы должны пропускать обычные данные и читать удаленные, каковых не имеем в секторе 5 на дорожке 21.
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0 – номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000001 – Номер дорожки (1)
Н: 00000000 – Номер головки (0)
R: 00000011 – Номер сектора (3)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Фаза результата:
ST0 = 01000000 - регистр состояния КГД
ST1 = 10000000 - регистр состояния КГД
ST2 = 01000000 - регистр состояния КГД
C = 00000001 – номер дорожки (1)
H = 00000000– номер головки (0)
R = 00010010 – номер сектора (12h=18d) – прочитана вся дорожка
N = 00000010 – код размера сектора (02 – 512 байт - стандартно)
Имеем аварийное завершение операции (биты 7 и 6 регистра ST0 равны 0 и 1 соответственно); бит 7 регистра ST1 равен 1 (несуществующий номер сектора), что говорит о том, что контроллер пытался прочесть сектор с адресом, большим существующего; бит СМ (ST2.6) имеет единичное значение, что означает, что во время операции чтения обнаружен сектор с маркером удаленных данных.
г) Выполнить команду "Запись удаленных данных" и повторить пункты б) и в).
А) Запись удаленных данных
Командная фаза:
MT MFM
КОП1: 0 1 001001
HDS DS0 DS1
КОП2: 00000 0 0 0
(HDS=0– номер головки; DS1=0 и DS0=0 – номер дисковода)
С: 00000001 – Номер дорожки (1)
Н: 00000000 – Номер головки (0)
R: 00000011 – Номер сектора (3)
N: 00000010 – Код размера сектора (02h = 512 байт - стандартно)
EOT: 00010010 – Количество секторов на дорожке (12h=18d - стандартно)
GPL: 00011011 – Длина межсекторного промежутка для операций «Чтение» и «Запись» (из таблицы параметров дискеты = 1Вh)
DTL: 11111111 – Максимальная длина передаваемых данных (используется, если не задана длина сектора, иначе – берется из таблицы параметров дискеты = FFh)
Байты результата:
ST0 = 00000000 - регистр состояния КГД
ST1 = 00000000 - регистр состояния КГД
ST2 = 00000000 - регистр состояния КГД
//форматы регистров состояния описаны выше, нулевые значения этих регистров говорят о том, что операция записи завершена успешно
C = 00000001 – номер дорожки (1)
H = 00000000 – номер головки (0)
R = 00000100 – номер сектора (4)
//мы записали данные в сектор 3 и автоматически головка переместилась на следующий сектор 4
N = 00000010 – код размера сектора (02 – 512 байт - стандартно)