Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [ 73 ] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

ваемые им параметры и уведомляют о неполадках. Теоретически таких ошибок возникать не должно, но что делать, если контроллер все же сообщит об этом? Для доморощенной системы лучше всего было бы вывести на экран текст свяжитесь с разработчиком , чтобы ошибку можно было найти или исправить. Для коммерческой системы, работающей на многих тысячах компьютеров по всему миру, такое поведение менее привлекательно. Вероятно, лучшее, что можно сделать в данном случае, это завершить текущий запрос с кодом ошибки и надеяться, что она не будет случаться слишком часто.

Временные ошибки контрольной суммы вызываются пылинками, которые остаются в воздухе между головкой и поверхностью диска. С ними можно бороться, повторив несколько раз операцию. Если же повторным чтением ошибка не устраняется, блок помечается как поврежденный (bad block). Такой блок в дальнейшем избегается.

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

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

Другая проблема, не решаемая при помощи файла поврежденных блоков, - это нарушение системной структуры, которая должна занимать фиксированное положение на диске. Практически у любой файловой системы есть структура, положение которой должно быть одним и тем же, с целью облегчения ее поиска. Если файловая система разбита на разделы, то можно переразбить ее и попробовать обойти сбойный блок, но если повреждены первые несколько секторов дискеты или жесткого диска, накопитель станет непригодным к использованию.

Умные контроллеры резервируют несколько дорожек, которые недоступны пользовательским программам. При форматировании диска контроллер определяет, какие из секторов содержат ошибки, и автоматически замещает их одним из запасных. Таблица, отображающая поврежденные блоки на запасные, хранится во внутренней памяти контроллера и на диске. Подмена происходит незаметно для драйвера, за исключением того, что не исключена потеря эффективности тщательно отработанного элеваторного алгоритма, если контроллер тайно будет использовать цилиндр 800 вместо запрошенного 3-го. Технология производства магнитных поверхностей исключительно точна, но она все равно не идеальна. Поэтому имеет большое значение механизм сокрытия таких дефектов от пользователя. Для жестких дисков (описание одного из них приведено в табл. 3.5) контроллер отслеживает появление новых сбойных блоков и, если ошибка неустранима, заменяет их запасными блоками. Работая с таким диском, драйвер практически никогда не будет видеть плохие блоки.



Дефектные секторы не являются единственным источником ошибок. Также возникают ошибки поиска цилиндра, вызванные механическими проблемами блока головок. Контроллер следит за положением блока головок. При установке головки на заданный цилиндр он выдает серию импульсов двигателю блока головок, по одному импульсу на цилиндр. Когда блок головок устанавливается в требуемое положение, контроллер считывает истинное значение цилиндра из заголовка первого попавшегося сектора. Если блок головок оказывается не на той дорожке, на которой нужно, возникает ошибка поиска.

Практически все контроллеры жестких дисков автоматически исправляют ошибки поиска, но большинство контроллеров гибких дисков (включая установленные на компьютерах с процессором Pentium) просто выставляют бит ошибки и оставляют все остальное драйверу. Драйвер обрабатывает ошибку, выдавая команду recalibrate. При этом блок головок отодвигается на самую внешнюю дорожку диска до упора. Это положение принимается контроллером за нулевую дорожку, таким образом, контроллер снова начинает понимать, где находится блок головок. Обычно это решает проблему. Если же нет, то либо нужно сменить диск, либо починить дисковод.

Как мы видели, контроллер в действительности представляет собой небольшой специализированный компьютер, полный программного обеспечения, переменных, буферов и, по всей видимости, ошибок. Иногда необычное стечение обстоятельств, например приход прерывания с одного устройства, в то время как другое устройство выполняет команду recalibrate, может разбудить спящую до тех пор ошибку, в результате которой контроллер войдет в бесконечный цикл или забудет, что он делал. Разработчики контроллеров обычно готовятся к худшему и предоставляют на всякий случай специальный контакт на микросхеме, обращение к которому вызывает сброс контроллера. Если никакие другие меры не помогают, драйвер может установить этот бит, отвечающий за подачу сигнала на такой контакт, и сбросить контроллер. Если и это не решило вопроса, то все что драйверу остается сделать - это вывести сообщение и сдаться.

Кэширование дорожек

Время, требующееся на переход к новому цилиндру, обычно много больше, чем время поворота диска и всегда больше времени передачи. Другими словами, если драйвер решил перевести куда-либо головку, многое зависит от того, будет ли читаться только один сектор или вся дорожка. Эффект в особенности заметен в том случае, если контроллер позволяет определить, над каким сектором находится дорожка, чтобы драйвер мог отдать ему команду на чтение следующего сектора, тем самым считывая дорожку целиком за один оборот диска. (Обычно в среднем на чтение отдельного сектора требуется половина оборота диска плюс время на чтение одного сектора.)

Некоторые драйверы поддерживают специальный кэш дорожки, невидимый для программ. Если запрошенный у контроллера сектор находится в этом кэше, обмениваться данными с диском не нужно. Недостаток такого подхода (помимо усложнения драйвера и необходимости выделения памяти для буфера) в том.



что передача данных пользовательской программе из кэша должна производиться процессором, при помощи программного цикла, а не DMA.

По данной причине многие современные контроллеры поддерживают кэш дорожки самостоятельно, в своей внутренней памяти. В этом случае кэширование происходит прозрачно для драйвера и передачу данных можно производить при помощи DMA. Если контроллер поддерживает подобную функцию, не имеет большого смысла дублировать ее в драйвере. Заметьте, что обеспечить чтение одной дорожки целиком могут как контроллер, так и драйвер диска, но не пользовательская программа, так как для пользовательских программ диск представляется линейной последовательностью блоков, без разбиения на дорожки и цилиндры.

3.7.3. Обзор драйверов жестких дисков в MINIX

Драйвер жесткого диска - это первая рассмотренная нами составная часть MINIX, которая работает с широким диапазоном оборудования различных типов. Поэтому, прежде чем обсуждать детали драйвера, мы кратко рассмотрим некоторые проблемы, порождаемые различиями в аппаратном обеспечении. Под обозначением 1ВМ РС в действительности скрывается семейство различных компьютеров, которые иногда имеют существенные расхождения. Первые представители семейства, оригинальные PC и РС-ХТ, работали с 8-битной шиной, соответствующей 8-разрядному внешнему интерфейсу процессора 8088. Следующее поколение, PC-AT, работали с 16-битной шиной, разработанной так, чтобы быть совместимой и со старыми 8-битными устройствами. Новые 16-разрядные устройства со старой шиной работать не могли. Шина AT была изначально рассчитана на системы, основанные на процессоре 80286, и использовалась во многих системах на основе 80386, 8486 и Pentium. Но эти процессоры имеют 32-разрядный интерфейс, поэтому существует несколько вариаций 32-битной шины, например Intel PCI.

Для каждой шины имеется отдельное семейство адаптеров ввода/вывода, подключаемых к объединительной плате. Вся периферия для определенного типа шины должна поддерживать стандарты этой шины, но не обязана быть совместимой с более старыми стандартами. В семействе IBM PC, как и в других системах, шина поставляется вместе со встроенным профаммным обеспечением, находящемся в ПЗУ BIOS (Basic I/O System, базовая система ввода/вывода). BIOS служит мостом между различными операционными системами и особенностями конкретного аппаратного обеспечения. Некоторые периферийные устройства содержат расширения BIOS, хранящиеся в чипах ПЗУ на самой карте. Проблема, с которой сталкивается разработчик операционной системы, состоит в том, что BIOS в IBM-совместимых компьютерах (особенно в ранних версиях) разрабатывалась для целей MS-DOS, операционной системы без поддержки многозадачности и работающей в 16-разрядном режиме, который является простейшим из режимов работы процессоров семейства 80x86.

Таким образом, перед создателем новой операционной системы для IBM PC встает несколько вопросов. Первый из них: использовать ли для поддержки обо-



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [ 73 ] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.