
Почему до введения LBA CHS начинался с 0,0,1
, а не с 0,0,0
?
решение1
К сожалению, именно так была реализована и принята в использование схема адресации CHS, популярная в то время. Это было принято в качестве официального соглашения для IBM-совместимых компьютеров в прерываниях BIOS, используемых для доступа к диску, что объясняет, почему это соглашение используется и по сей день. ОтСтандарт ECMA-107, Объем и файловая структура дисковых картриджей для обмена информацией(это также упоминается в оригинале)Спецификация АТА-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/256 всех возможных секторов, к которым может получить доступ адресация логических блоков, поскольку в CHS нет сектора 0.
Таким образом, для логической адресации CHS, хотя первые индексы цилиндра/головки начинаются со смещения, основанного на 0, и первыесекториндекс начинается с1(например, минимально возможный адрес CHS - 0/0/1), это ничего не меняет вфизическийРасположение этого сектора. Подумайте об этом как о первомфизическийсектор на диске называется "сектор 1", занимая CHS 0/0/1. Действительно, "первый" элемент в большинстве языков программирования имеет нулевой базис, поэтомулогичныйадрес сектора по адресу CHS 0/0/1 равеннуль( 0x00
).
Это имеет гораздо больше смысла с точки зрения логики (а именно, «ноль»)логичныйадрес, являющийся первымфизическийсектор), поскольку мы можем адресовать дисковое устройство как любое другое устройство памяти (поскольку каждый сектор имеет уникальный линейный адрес для сопоставления его с физическим сектором), поэтому имеет смысл начинать LBA с нуля. Действительно, если мыпреобразовать адрес CHS 0/0/1 в LBA, то результирующий LBA будет равен 0x00000000
(именно поэтому 1 вычитается из индекса сектора в большинстве расчетов CHS в LBA, и почему 1 добавляется к индексу для расчетов LBA в CHS).
решение2
Я попытался проследить историюЧСи фиаско с нумерацией секторов "начиная с 1", которое вызвало множество сложностей для разработчиков дисковых драйверов и привело к быстрому ростуЛБА.
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 изменила нумерацию секторов с нуля на единицу.
Из двенадцати инженеров IBM, которым было поручено создание персонального компьютера IBM (модель 5150),Дэвид Дж. Брэдлиразработал код для своего BIOS. Так что он тот, кто, среди всех прочих деталей, принял решение о параметрах прерываний диска. Мы также обязаны этому парню вместе с Мелом Халлерманом знаменитым CTRL+ ALT+ DEL.
Такответна вопрос
Почему в CHS отсчет секторов начинается с 1, а не с 0?является :
Потому что Дэвид Дж. Брэдли запрограммировал BIOS таким образом..
Что касается того, почему он сделал это таким образом, то лучше всего на это ответит он сам. Если бы мне пришлось угадывать, я бы сказал, что он оставил сектор ноль в качестве сектора адресации, по которому водитель мог проверить, что головка на правильном пути.
Поскольку диски были фактически спроектированы так, чтобы не требовать такого механизма, и инженеры не были готовы тратить один сектор из-за BIOS, нулевой сектор так и не появился. После этого разработчикам драйверов пришлось вычитать единицу и прибавлять единицу к адресам секторов для всех вызовов BIOS диска.
решение3
Первая спецификация дискет была сделана IBM с появлением IBM 3740 и не упоминает, что есть сектора, зарезервированные для системы. Единственным резервированием для системы является дорожка 00, которая хранит только «метки набора данных», которые идентифицируют тип информации, хранящейся на дорожках 01–76. Она четко определяет, что первый сектор — это СЕКТОР 1. Это не совпадение, а вопрос естественной нумерации по отношению к нумерации компьютера.
Мы можем заметить, что когда человек начинает что-либо считать, он начинает не с нуля, а с единицы. Например, представьте, что в классе 135 учеников. Подсчет числа будет примерно таким: Один, два, три... сто тридцать четыре, сто тридцать пять.
Его числовое представление будет таким: 1, 2, 3, ... 134, 135. Пока что мы согласны, не так ли?
Теперь давайте разместим цифры, которые не представлены как 0. Это будет выглядеть так: 001, 002, 003, ..., 015, 016, ..., 099, 100, ..., 133, 134, 135
Вот что происходит сЧС:0,0,1 - 0,0,2 - 0,0,3...
Примечательно, что строки в таблицах Excel или автоматически нумеруемые поля в базе данных начинаются с 1, а не с 0, и никто ничего об этом не сказал.
Дэвид Дж. Брэдли планировал BIOS таким образом?
Да, но он не был снаружи.
Определенно нет технических причин, по которым SECTOR 0 не может быть использован, если только он не зарезервирован и не скрыт от пользователей по другим причинам. В принципе все указывает на то, что это вопрос естественной нумерации.
GA21-9152-2 Файл № 3740-00,15
IBM 3740 Data Entry System
страница 12
ИНИЦИАЛИЗАЦИЯ ДИСКА
...Каждый диск содержит две запасные дорожки для замены любых нерегулярных дорожек. Кроме того, функция инициализации обеспечивает средства изменения последовательности адресов секторов на дискете. Обычно последовательность секторов находится в числовом порядке (1, 2, 3, ... 25,26).
страница 24
МАРКИРОВКА ДАННЫХ НА ДИСКЕТЕ
Во время инициализации метка набора данных для набора данных магнитно записывается на индексную дорожку (дорожка 00) дискеты. Основное назначение этой метки — показать местоположение набора данных на дискете
Это было в 1973 году. Данные записывались на 8-дюймовую дискету. IBM PC 5150 появился на свет 12 августа 1981 года... и мы не можем забывать, что им приходилось поддерживать некоторую совместимость с предыдущими устройствами.
Никаких технических причин определенно не было.