in2000:

Использует первое из (H,S) = (64,32), (64,63), (128,63), (255,63) которое сделает C равным < = 1024. В последнем случае, усекает C до 1023.

seagate:

Считывает C,H,S с дичка. (Кошмар!) Если C или S слишком велики, то устанавливает S=17, H=2 и удваивает H до тех пор пока C не станет <= 1024. Это означает,что H будет установлено в 0 если M > 128*1024*17 (1.1 ГиБ). Это баг.

ultrastor и u14_34f:

Одна из трех разметок ((H,S) = (16,63), (64,32), (64,63)) используется в зависимости от режима разметки контроллера.

Если драйвер не указывает геометрию, то мы возвращаемся назад к "отгадыванию" используя таблицу разделов, или используя полную емкость диска.

Взглянем на таблицу разделов. Т.к. обычно разделы оканчиваются на границе цилиндров, мы можем задать end = (endC,endH,endS)

для любого раздела , просто укажите H = endH+1 и S = endS. (обратно сектора отсчитываются от 1.) Если быть более точными , делается следующее. Если есть не пустой раздел , выбирается раздел с наибольшим beginC. Для этого раздела , смотрим на end+1, вычисляемое путем добавления start и length и предполагая что раздел заканчивается на границе цилиндров. Если оба значения совпадают, или если endC = 1023 и start+length целое произведение (endH+1)*endS, то предполагается что данный раздел расположен на границе цилиндров. , и используется H = endH+1 и S = endS. Если это не срабатывает, потому - что нет разделов , или потому - что они имеют странные размеры, то используется только M - емкость диска. Алгоритм: возьмем H = M/(62*1024) (округленное вверх), S = M/(1024*H) (округленное вверх), C = M/(H*S) (округленное вниз). Это имеет эффект умножения (C,H,S) с C максимум 1024 и S максимум 62.