Предыдущий раздел | НАЧАЛЬНЫЕ ЗАГРУЗЧИКИ | Следующая глава |
Первичный начальный загрузчик должен считывать с диска загрузочный файл вторичного начального загрузчика. Для выполнения информационного обмена с диском можно использовать два подхода: 1) управление дисководом на уровне портов; 2) использование системных вызовов BIOS. Недостатками первого подхода являются не только трудоемкость программирования, но и сравнительно большие затраты памяти. Поэтому удается реализовать первичный загрузчик, выполняющий управление дисководом на уровне портов, лишь для гибких дисков (дискет). Загрузчик с диска большей емкости не умещается на одном секторе. Поэтому для реализации такого загрузчика требуется использовать системные вызовы BIOS.
Системные вызовы BIOS, основанные на команде “int 13h”, являются универсальными, позволяя работать с любыми дисководами, с которых возможна начальная загрузка, в том числе, с дисководами для flash-дисков. Именно для такого дисковода мы будем разрабатывать свой первичный загрузчик.
Кроме того, экономия памяти при использовании вызовов BIOS позволяет возложить на первичный загрузчик часть функций, выполняемых вторичным загрузчиком. А именно – поиск загружаемой программы в файловой структуре системы, пользуясь именем файла. При работе с дисководом на уровне портов такая функция в принципе нерелиазуема, так как приходится экономить каждый байт даже при реализации загрузки фиксированной области диска. Следствием такого расширения функций первичного загрузчика является то, что при загрузке достаточно небольших автономных программ, работающих исключительно в реальном режиме процессора, отпадает надобность во вторичном загрузчике. При этом всю загрузку автономной программы выполняет сам первичный загрузчик.
Системные вызовы BIOS для работы с дисками “int 13h” являются устаревшими, так как, во-первых, они не позволяют работать со всем объемом информации, находящейся на современном диске большой емкости. При программировании первичного загрузчика этот недостаток не является существенным, если загружаемая программа (например, вторичный загрузчик) находится не очень далеко от начала диска.
Во-вторых, при использовании указанных системных вызовов в своей программе приходится учитывать некоторые физические особенности того диска, с которым производится работа. Подобные физические особенности принято называть геометрией диска. Достаточно типичная геометрия диска приведена на рис.81.
Рис. 81. Упрощенное представление магнитного диска
Магнитный диск состоит из одной, двух, или большего числа металлических или стеклянных пластин, вращающихся вокруг общей оси. Одна или обе поверхности каждой пластины покрыты тонким однородным слоем магнитного материала. Подобная поверхность пластины условно разделена на тонкие кольца, называемые дорожками. Все дорожки на каждой пластине пронумерованы, причем дорожка 0 находится около внешнего края пластины. Все дорожки диска, имеющие одинаковый номер, принадлежат одному цилиндру, номер которого определяется номерами входящих в него дорожек. Например, цилиндр 0 объединяет дорожки с номерами 0 (рис.81).
Для чтения (записи) информации с пластины (на пластину) используется один или несколько элементов, называемых головками. Количество головок зависит от используемого варианта конструкции дисковода. В первом из этих вариантов каждую поверхность пластины обслуживает единственная головка, которая может перемещаться по радиусу диска дискретными шагами. При этом каждый шаг соответствует одной дорожке пластины. После того, как головка «зависнет» над требуемой пластиной, она может выполнять информационный обмен с этой дорожкой. Так как все головки диска связаны жестко в единую «гребенку», то при установке одной из головок на требуемую дорожку все остальные головки «зависнут» над дорожками этого же цилиндра. Следствием этого является то, что переход между дорожками одного цилиндра не требует каких либо механических перемещений головок. Для такого перехода достаточно лишь выполнить электронное переключение головок. Другой вариант конструкции дисковода предполагает, что каждую дорожку поверхности пластины обслуживает своя отдельная головка. В этом случае никакого перемещения головок не производится, так как для выбора требуемой дорожки достаточно лишь электронно включить требуемую головку.
Что касается информационного обмена с дорожкой, то он производится следующим образом. Во-первых, заметим, что магнитная поверхность дорожки состоит из маленьких фрагментов, называемых магнитными доменами. Во время движения дорожки мимо головки (вследствии вращения диска) магнитное поле головки может повлиять на полярность того домена, который находится в данный момент времени рядом с головкой. Благодаря этому магнитный домен может использоваться для записи одного бита информации. При этом одна полярность домена кодирует 0, а другая – 1. Во время чтения информации с диска, наоборот, полярность текущего домена влияет на магнитное поле головки. Это состояние магнитного поля считывается в электронную цепь и распознается ею как 0 или 1. Несмотря на то, что длины дорожек на пластине разные, все они содержат одинаковое количество доменов, кодирующих биты.
Поверхность пластины, как и любой круг, можно разделить на угловые секторы (рис.81). Возьмем размер углового сектора таким, чтобы он «вырезал» из каждой дорожки на поверхности пластины дугу, содержащую 512 бит. Эта дуга дорожки называется сектором. Как видно из рис.81, один угловой сектор «вырезает» секторы одинаковой длины (измерение в битах) не только на одной поверхности одной пластины, но и на всех поверхностях всех пластин. Разбиение дорожки диска на секторы производится во время низкоуровневого форматирования диска. Во время этого форматирования начало каждого сектора помечается специальной последовательностью битов. Кроме того для каждого сектора записывается его номер.
С точки зрения драйвера дисковода сектор является минимальной единицей информационного обмена между диском и ОП. Для выполнения такого обмена каждый сектор задается своим адресом:
(номер цилиндра; номер поверхности; номер сектора)
При использовании системных вызовов BIOS “int 13h” в программе также приходится пользоваться такими же «физическими» адресами секторов. Драйверы дисководов, входящие в состав ОС, а так же в состав современных BIOS, позволяют использовать в программе линейные адреса секторов. Каждый такой адрес представляет собой номер сектора на диске, начиная с нуля. Например, драйверы дисководов, входящие в состав DOS, предоставляют развитый программный интерфейс для работы с дисками, минуя файловую систему. Сюда относятся не только линейная адресация секторов диска, но и огромный объем дискового пространства. Единственная мелочь – в момент начальной загрузки никакой DOS в ОП еще нет. Поэтому переходим к рассмотрению системных вызовов “int 13h”.
В случае ошибки любой вызов “int 13h” устанавливает в единицу флаг CF, а в регистре AH возвращает код ошибки:
00 – завершение без ошибки;
01 – недопустимый номер функции;
02 – не найден адресный маркер;
03 – диск защищён от записи;
04 – сектор не найден;
05 – не выполнен сброс в исходное состояние;
06 – произошла смена диска;
07 – повреждена таблица параметров дисковода;
08 – выход за границу ПДП;
09 – попытка выполнить ПДП за пределами в 64к;
0A – обнаружен дефектный сектор;
0B – обнаружена дефектная дорожка;
0C – нестандартный формат диска или дорожки;
0D – в команде форматирования указано недопустимое число секторов;
0E – обнаружена адресная метка контрольных данных;
0F – уровень арбитража ПДП вышел за пределы допустимого;
10 – неустранимая ошибка чтения данных;
11 – ошибка данных, исправленная по контрольному коду;
20 – отказ контроллера;
40 – сбой при выполнении поиска;
80 – диск не отвечает (тайм-аут);
AA – дисковод не готов;
BB – неизвестная ошибка;
CC – ошибка записи;
E0 – ошибка регистра состояния;
FF – ошибка при выполнении операции опознавания;
Рассмотрим наиболее важные функции прерывания 13h.
1. Сброс состояния дисковой системы – функция 00h.
Функция 00 — Сброс состояния дисковой системы
Необходимо вызывать перед началом работы с дисковой подсистемой, в случае любой ошибки работы с дисковой подсистемой
Вход:
AH — 00
DL — Номер дисковода (00 — 7F гибкий диск, 80 — FF жёсткий диск)
При установленном бите 7 в регистре DL происходит сброс ВСЕХ жёстких и гибких дисков.
Выход:
AH — Состояние дисковой подсистемы
Предыдущий раздел | В начало | Следующая глава |