LINUX.ORG.RU

Разбиение HDD (ещё вопрос).


0

0

Была тема, но я спрашивал другое. Тут такая проблема: Предположим, я хочу создать самый первый primary раздел, скажем, 124 цилиндра начиная с нуля. Нужно заметить, что это < 1024. Как посчитать begin CHS 3 байта и end 3 байта? Если больше 1024 начало и конец раздела, то тут понятно: и в том, и в другом просто будет 254/255/255, и только LBA используется. Но ведь старенькие ОСи и программы (например, загрузчик ведь использует INT13h BIOS драйвер) смотрят на эти значения. То есть как мне посчитать begin CHS 3 байта и end CHS 3 байта? Мне кто-то ответил, что на винтах > 1024 цилиндра вообще пишут 254/255/255 всегда, даже на маленьких первых разделах. Это неправда! Дык как тогда тот же fdisk считает? Я именно для СОЗДАНИЯ раздела спрашиваю, а не для получения инфы, с этим больше проблем нет.
Заранее спасибо.

★★

: Мне кто-то ответил, что на винтах > 1024 цилиндра вообще пишут 254/255/255 всегда, даже на маленьких первых разделах. Это неправда!

Сорри, если тогда недостаточно понятно выразился. Я имел ввиду, что 254/255/255 пишется на больших разделах.

Принцип очень простой: разделы создаются так, чтобы раздел занимал ЦЕЛОЕ ЧИСЛО ЦИЛИНДРОВ.

Пример:
Пусть геометрия винта: 63 сектора, 800 цилиндров, 200 головок.
Создается первый primary раздел размером 124 цилиндра.
Его начало будет CHS: 0/0/1 - там MBR. Фактически раздел начнется в CHS 0/1/1 (там boot). Кончаться раздел будет на поледней головке (199) и последнем секторе (63) цилиндра 123: CHS 123/199/63.

Следущий раздел начнется с начала 124-го цилинда в 124/0/1. И так далее.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, ещё: ведь эти три байта! Как CHS вписывается в три байта? Вот так:

h = byte1; s = byte2 & 0x3f; c = ((byte2 & 0xc0) << 2) + byte3;

Предположим, я подсчитал CHS. Тогда как найти byte1, byte2, byte3. Ведь записывать-то надо именно их.

drish ★★
() автор топика
Ответ на: комментарий от drish

Ты что, серьезно про подбор ? :)))
Это же элементарная арифметика!
Может, быть, ты не понимаешь, что делает эта строчка:
h = byte1; s = byte2 & 0x3f; c = ((byte2 & 0xc0) << 2) + byte3;
Тогда учи C (или арифметику :)

anonymous
()
Ответ на: комментарий от anonymous

Про подбор я не серьёзно. Ответь, пожалуйста, если знаешь: как подсчитать byte{2,3}? И почему s = byte2 & 0x3F? Может, s = byte2 & geometry.sectors; (хоть секторов на дорожке и 63, просто правильно ли я понял, причём тут 0x3F)? Вот зачем 0xC0, я не понимаю :). А какое побитовое AND в арифметике :)?

drish ★★
() автор топика
Ответ на: комментарий от drish

Считаем bytes2:
В младшие 6 бит пишем номер сектора (s), а в старшие 2 бита - 2 старших бита цилиндра (c).

Считаем bytes3:
Сюда просто пишем младшие 8 бит цилиндра (c).

enjoy :)

anonymous
()
Ответ на: комментарий от anonymous

То есть так получается:

8 бит головка
6 бит сектор
10 бит цилинцр

drish ★★
() автор топика
Ответ на: комментарий от drish

Да, 8 бит головка, 6 бит сектор, 10 бит цилиндр.
Ты хочешь, чтобы тебе тут программку на C написали? Ну и наглость :)
Или побитовыми сдвигами, или объяви структурку с битовыми полями и не мучайся.

typedef union
{
  unsigned char chs[3];
  struct {
  unsigned char cyl: 10;
  unsigned char sec: 6;
  unsigned char head: 8;
  } b;
} CHS;

anonymous
()
Ответ на: комментарий от anonymous

То есть:
char chs[3];
struct { --- } b;
b.cyl=cylinder;
b.sec=sector;
b.head=head;
memcpy(chs,&b,sizeof(b));

> Ты хочешь, чтобы тебе тут программу на C написал?



Нет. Я написал сам прогу (типа fdisk'a). Только вот с CHS запара в создании разделов. А инфу и всякие мелкие функции я сделал.

drish ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.