AssistedLBA*
Итак, я близок к завершенству: AssistedLBA последний режим,
использовавший "координатную" систему для адресации секторов винчестера.
В первую очередь необходимо отметить важную особенность режима
AssistedLBA: в конечном счете номер требуемого сектора будет
предоставлен контроллеру в формате LBA, не CHS. Это важно. Что такое
LBA, зачем он нужен и что собой представляет скажу чуть позже. Важно
понимать следующую вещь: контроллер должен уметь работать с адресами в
формате LBA. Помимо этого, AssistedLBA -- самый "экономный" режим
адресации -- с его помощью можно адресовать наибольшее количество
секторов, в сравнении с предыдущими режимами. Но и нельзя забывать, что
сама по себе трансляция -- всего лишь способ перевода CHS значения,
которое понимает BIOS в CHS значение, понятное контроллеру. После
трансляции полученное CHS значение значение переводится кодом BIOSа в
LBA значение, подготавливается и уже в этом виде скармливается
контроллеру.
Теперь немного подробнее про саму трансляцию:
if CLS > 8192
1. V = CLS * HDS - 1, где:
CLS -- количество цилиндров на головку
HDS -- количество головок
V -- просто некоторая переменная :).
2. Округлить вверх значение выражения V / 1024 + 1 до ближайшего из:
16, 32, 64, 128, 255. Полученное значение будет использоваться как
максимальное значение номера головки.
3. Разделить V на значение полученное на шаге 2. Результат -- максимальный номер цилиндра.
В результате, максимальное количество адресуемых секторов равно: 255 *
1024 * 63 = 16 450 560. В байтах это 8 422 686 720. В принципе, как я
понимаю, это максимум, что можно выжать из условий "255 головок, 1024
цилиндра, 63 сектора на дорожку".
Итак, это сама трансляция. Как и раньше, при количестве цилиндров менее
8193 подсчет максимальных логических значений выполняется стандартно,
как в ECHS.
И все же я что-то недопонимаю глобально. Получается странная картина:
например, у нас есть физическая геометрия: HDS: 16 CLS: 16384.
Виртуальная, тогда, должна быть HDS: 256 CLS 1024. Множитель: 16. И там
и там указаны не максимальные значения головок/цилиндров, а общее
количество. При этом получается, что обратиться к цилиндру, чей номер
не кратен 16 не возможно! Т.е. 256 / 16 = 16. Остатка нет! И как же
тогда обратиться к цилиндру, например, 15? Даже если мы укажем H: 256
C: 1, в итоге получим H16 C16.
Придется оставить пока что, как есть -- общий принцип понят, обдуман и переварен. Обидно, но по-другому не получается...
*Частичное понимание материала достигнуто благодаря статье
http://www.mossywell.com/boot%2Dsequence