До введения LBA почему CHS начинается с 0,0,1
а не с 0,0,0
?
3 ответа
Я попытался проследить историю CHS и фиаско нумерации секторов "начиная с 1", что вызвало много затруднений для авторов дисковых драйверов и привело к быстрому росту LBA.
CHS восходит к тем дням, когда персональные компьютеры работали на дискетах и когда был изобретен BIOS. Вот что говорит Википедия :
Термин BIOS (базовая система ввода / вывода) был изобретен Гэри Килдаллом и впервые появился в операционной системе CP / M в 1975 году, описывая машинно-зависимую часть CP / M, загружаемую во время загрузки, которая напрямую взаимодействует с оборудованием.
Исследование BIOS CP/M обнаружило документ информационный архив CP/M: системные вызовы BDOS, в которых номера секторов начинаются с нуля. Вывод таков : самая ранняя схема CHS фактически использовала адреса секторов, начинающиеся с нуля.
Адреса с одним сектором впервые были представлены с первым IBP/PC. Документ INT 13 - Службы BIOS дискет, в частности, гласит:
Most disk BIOS calls use the following parameter scheme:
AH = function request number
AL = number of sectors (1-128 dec.)
CH = cylinder number (0-1023 dec.)
CL = sector number (1-17 dec.) <--------!!!
DH = head number (0-15 dec.)
DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
DL = drive number (0=A:, 1=2nd floppy, 80h=C:, 81h=D:)
Note that some programming references use (0-3) as the
drive number which represents diskettes only.
ES:BX = address of user buffer
Таким образом, именно IBM/PC путем фактической реализации BIOS преобразовал нумерацию секторов с нуля на единицу.
Дэвид Дж. Брэдли (David J. Bradley ) из двенадцати инженеров IBM, назначенных для создания персонального компьютера IBM (модель 5150), разработал код для своего BIOS. Так что именно он, среди всех других деталей, определился с параметрами прерываний диска. Мы также обязаны этому парню вместе с Мелом Халлерманом знаменитым CTRL+ALT+DEL.
Таким образом, ответ на вопрос « Почему счет секторов начинается с 1, а не с 0 в CHS» :
Потому что Дэвид Дж. Брэдли так программировал BIOS.
Относительно того, почему он сделал это таким образом, лучше всего ответить самому. Если бы мне пришлось угадывать, я бы сказал, что он оставил сектор ноль как сектор адресации, с помощью которого водитель мог проверить, что голова находится на правильном пути.
Поскольку диски фактически были сконструированы так, чтобы не требовать такого механизма, а инженеры не были готовы тратить один сектор из-за BIOS, нулевой сектор так и не появился. После этого авторам драйверов было необходимо вычесть один и добавить один адрес сектора для всех вызовов дисков BIOS.
К сожалению, именно так была внедрена и принята в действие схема адресации CHS, популярная в то время. Это было принято как официальное соглашение для IBM-совместимых компьютеров в прерываниях BIOS, используемых для доступа к диску, объясняя, почему это соглашение используется по сей день. Из стандарта ECMA-107, тома и файловой структуры дисковых картриджей для обмена информацией (это также упоминается в исходной спецификации ATA-1):
6.1.3 Номер логического сектора
Каждый сектор тома должен быть идентифицирован логическим номером сектора. [...] Логические номера секторов должны присваиваться в возрастающей последовательности, начиная с 0, начиная с сектора 1, дорожка 00, сторона 0, продолжая на дорожку 00, сторону 1 (если FDC можно записать с обеих сторон), а затем дорожке 01, сторона 0 и т.д.
Эта проблема решается в спецификациях для некоторых жестких дисков, где отмечается, что данный логический адрес CHS отличается от местоположения физического адреса CHS . Это дополнительно обсуждается в Справочном руководстве по интерфейсу Seagate ATA, которое содержит этот интересный рассказ:
5.1 Логическая адресация блоков
[...] предполагается, что сектора на приводе линейно отображаются с LBA 0 цилиндра 0 / головка 0 / сектор 1.
[...] Для всех режимов перевода C = 0, H = 0, S = 1 эквивалентно LBA = 0. Невозможно вычислить эквивалентный CHS для всех адресов логических блоков во всех режимах перевода, потому что эта формула работает только в одном направлении. Это связано с тем, что CHS-адресация не может получить доступ к 1/25 из всех возможных секторов, к которым может обратиться логическая блочная адресация, поскольку в CHS нет сектора 0.
Таким образом, для логической адресации CHS, хотя первые индексы цилиндра / головки начинаются со смещения на основе 0, а первый индекс сектора начинается с 1 (например, минимально возможный адрес CHS равен 0/0/1), это ничего не меняет в физическое местоположение этого сектора. Думайте об этом как о первом физическом секторе на диске, который называется "сектор 1" и занимает CHS 0/0/1. Действительно, "первый" элемент в большинстве языков программирования основан на 0, поэтому логический адрес сектора по адресу CHS 0/0/1 равен нулю (0x00
).
Это логически более логично (а именно, "нулевой" логический адрес является первым физическим сектором), поскольку мы можем обращаться к дисковому устройству как к любому другому устройству памяти (поскольку каждый сектор имеет уникальный линейный адрес для сопоставления его с физическим сектор), поэтому для LBA имеет смысл начинать с нуля. Действительно, если мы переведем адрес CHS 0/0/1 в LBA, результирующий LBA будет 0x00000000
(вот почему 1 вычитается из индекса сектора в большинстве расчетов CHS и LBA и почему 1 добавляется в индекс для Расчеты LBA в CHS).
Первая спецификация на гибких дисках была сделана IBM с появлением IBM 3740 и не упоминает, что есть сектора, зарезервированные для системы. Единственное резервирование для системы - это трек 00, в котором хранятся только "Метки набора данных", которые идентифицируют тип информации, хранящейся в треках с 01 по 76. Он четко определяет, что первый сектор - это СЕКТОР 1. Это не совпадение, а вопрос естественной нумерации против нумерации компьютера.
Мы можем наблюдать, что когда человек начинает что-то считать, он начинается не с нуля, а с одного. Например, представьте, что в классе 135 учеников. Подсчет числа будет примерно таким: раз, два, три ... сто тридцать четыре, сто тридцать пять.
Его числовое представление будет таким: 1, 2, 3, ... 134, 135 Пока что мы согласны, верно?
Теперь давайте поместим цифры, которые не представлены как 0. Это будет выглядеть так: 001, 002, 003, ..., 015, 016, ..., 099, 100, ..., 133, 134, 135
Вот что происходит с CHS: 0,0,1 - 0,0,2 - 0,0,3 ...
Важно, что строки в таблицах Excel или в авто-числовых полях в базе данных начинаются с 1, а не с 0, и никто ничего не сказал по этому поводу.
Дэвид Дж. Брэдли так планировал BIOS?
Да, но он не был вне.
Безусловно, нет технической причины, по которой SECTOR 0 нельзя использовать, если он не зарезервирован и скрыт от пользователей по другим причинам. В принципе, все указывает на это вопрос естественной нумерации.