Як правило, не доводиться замислюватися про структуру, а тим більше про розрахунок таблиці розділів жорсткого диска. Ми звикли покладатися на Fdisk, PQMAGIC і їм подібні програми. Але що робити, якщо вони «відмовляються» працювати, а таке, на жаль, іноді трапляється. Бувають, наприклад, випадки, коли BIOS підтримує 8-Гбайт жорсткий диск, а ви купили ємністю 10 Гбайт або сильно пошкоджена його фізична поверхню, і тоді вам, можливо, буде потрібно «вручну» розрахувати і створити розділи. Виникають подібні проблеми і при зсуві таблиці розділів диска.
У всіх перерахованих вище випадках треба знати структуру таблиці розділів і вміти її розраховувати.
Таблиця розділів
У першому секторі жорсткого диска зберігаються програма його завантаження і дані про розбиття на розділи. Вся ця інформація називається MBR (Master Boot Record) - головний завантажувальний запис (в деяких джерелах до MBR відносять тільки виконуваний код, що зберігається в даному секторі). Визначимо розділ як частина фізичного диска, що служить контейнером для логічних дисків. Існує два види розділів: основний і розширений. Перший «вміщує» один логічний диск, а краще сказати, сам їм є. А другий (розширений) дійсно служить контейнером логічних дисків. (Під логічним диском будемо розуміти деяку ділянку фізичного диска, розпізнається ОС як самостійний накопичувач, який має унікальне ім'я.)
Завершується сектор MBR, як, втім, і будь-який інший, що містить таблицю розділів, сигнатурою Uk (55 AA). (Цікаво, що кожен завантажувальний сектор DOS також повинен закінчуватися даної сигнатурою). При включенні харчування ПК або його перезавантаження BIOS саме цей сектор завантажує в пам'ять і запускає на виконання зберігається в ньому програму, - правда, на жаль, іноді це буває і вірус.
Перший сектор фізичного диска (циліндр - 0, головка - 0, сектор - 1) - найважливіший. Якщо він з яких-небудь причин виявляється пошкодженим, то диск можна просто викинути.
Нас цікавить таблиця розділів ( табл. 1 і 3 ).
Вона починається зі зсуву 1BEh (446) завантажувального сектора, займає 64 байт і представляє собою послідовність чотирьох 16-байт записів. Кожні 16 байт описують один розділ, що накладає обмеження на число останніх: їх не може бути більше чотирьох. Але обмеження на число логічних дисків знімається шляхом використання розширеного розділу.
Кожен запис в таблиці, очевидно, повинна містити вказівку на початок, кінець і величину логічного диска або розділу. Повний формат запису, яка описує розділ, наведений в табл. 2 .
В табл. 3 показаний приклад таблиці розділів, записаної в MBR для 3,2-Гбайт диска з розділами файлової системи FAT 16.
елементи табл. 2 і табл. 3 пов'язані, цей зв'язок відображає наступний ланцюжок: 1-> 2; 2> 3; 3> 4,5; 4> 1; 5> 6; 6> 7,8; 7-> 9; 8-> 10. Тут значення зліва - номер рядка табл. 2, значення праворуч - номер стовпця табл. 3.
Якщо в розділах встановлена файлова система FAT 32, то в табл. 3 текстове значення 1-го стовпця в залежності від версії програми DiskEdit може бути одним з наступних: FAT 32, FAT 32x, BIGDOSx, EXTENDx.
Значення 4, 3, 5-го стовпців основного розділу повинні вказувати на завантажувальний сектор, але вже логічного диска (його також називають DOS-сектором). Він містить завантажувальний запис (або її початок) цього логічного диска. А значення тих же стовпців для розширеного розділу повинні вказувати на сектор, що містить подібну таблицю розділів, в якій можуть бути як основний, так і розширений розділи. І так далі по ланцюжку.
Значення стовпців з 3-го по 8-й ми «вибираємо» самі і цим задаємо початок і завершення логічного диска (розділу). Однак дані в 9-м і 10-м шпальтах необхідно обчислити за такою формулою:
(1)
де H - число головок в циліндрі (вказується, як правило, на його корпусі);
S - число секторів на доріжці (також вказується на корпусі); зазвичай S = 63;
C, Nhead, Nsect. - координати сектора.
Дана формула дозволяє визначити число секторів між секторами з параметрами Cstart, Nhead start, Nsect. start і Cend, Nhead end, Nsect. end. При розрахунку зсуву DOS-завантажувач від MBR використовуються наступні значення: Cstart = 0, Nhead start = 0, Nsect. start = 1, що відповідає координатам 1-го сектора диска (0,0,1). Координати Cend, Nhead end, Nsect. end відповідають 1-му сектору логічного диска, причому Nsect. end найчастіше дорівнює одиниці. Ці координати беруться з 4, 3, 5-го стовпців табл 3. Таким чином,
(2)
де H і S визначаються фізичними характеристиками жорсткого диска.
Формула 2 справедлива тільки для розрахунку зсуву початку логічного диска (розділу) щодо сектора MBR, в інших випадках слід користуватися формулою 1. Причому потрібно пам'ятати, що зазвичай Cstart, Nhead start і Nsect. start - координати сектора, що містить таблицю розділів. Як правило, значення Cstart, Nsect. start відповідають значенням 4-го і 5-го стовпців, а значення Nhead start береться на одиницю меншим значення 3-го стовпця табл. 3.
Величина розділу (логічного диска) визначається так:
(3)
де значення Cend, Nhead end, Nsect. end беруться з 7, 6, 8-го стовпців табл. 3. Слід зауважити, що параметри Cend, Nhead end, Nsect. end в формулах 2 і 3 беруться з різних стовпців.
Отримані значення для DS і DL заносяться відповідно в 9-й і 10-й стовпці.
Отже, ми розглянули первинну структуру організації зберігання інформації на жорсткому диску, познайомилися з її форматом і способом розрахунку. Важливо зрозуміти, що розділи можна розташувати в будь-якому місці диска. Це буває потрібно при розкиданих по поверхні жорсткого диска осередках пошкодження.
література
Нортон П., Уілтон Р. IBM PC і PS / 2. Керівництво по програмуванню. М: Радіо і зв'язок, 1994.
Ідея дослідження та деякі матеріали взяті з http://stein.nm.ru .
Приклад розрахунку таблиці розділів
Припустимо, що є жорсткий диск з фізичними характеристиками C = 621, H = 64, S = 63 і його завантажувальний сектор (0,0,1) не пошкоджений. В інтервалах з 1-го циліндра по 250-й і з 516-го по 525-й є множинні пошкодження. Програма Fdisk з цим диском, швидше за все, не знайшов спільної мови.
Наша мета - вручну організувати розділи. Для роботи, якщо немає другого жорсткого диска, візьмемо дискету. Де-небудь «дістаємо» MBR - це робиться за допомогою програми DiskEdit (записуємо фізичний сектор (0,0,1) робочого диска в файл). Потім, скориставшись знову ж DiskEdit, запишемо придбаний файл з Master Boot Records в сектор (0,0,1) вже на нашому жорсткому диску. Тепер необхідно відкоригувати таблицю розділів (знову ж за допомогою DiskEdit) відповідно до нашими завданнями (це можна зробити і в файлі, а потім вже записувати його в сектор) - заповнюємо з 1-го по 10-й стовпці таблиці (за шаблон беремо табл . 3) значеннями для нашого диска.
Вибираємо систему: нехай це буде BIGDOS - розділ з FAT 16.
Визначаємо ознака завантаження - у 2-му стовпці ставимо «Так / Yes».
Встановлюємо початок нашого розділу / диска - заповнюємо стовпці з 3-го по 5-й значеннями 1, 254 і 1 відповідно. Вводимо завершення розділу / диска: заповнюємо стовпці з 6-го по 8-й значеннями 63, 512, 63 відповідно.
До і після пошкоджених ділянок задаємо деякий проміжок. Значення для 9-го стовпця розрахуємо за формулою 2:
Cend і Nhead end беремо з 4-го і 3-го стовпців відповідно, т. Е. Cend = 254, Nhead end = 1, а H = 64, S = 63. Таким чином,
Параметр 10-го стовпчика вираховуємо за формулою 3:
Тут H і S не змінюються, а Cend, Nhead end, Nsect. end взяті з 7-го, 6-го і 8-го стовпців.
Так як створення інших розділів ми не плануємо, то всі інші рядки заповнюємо нулями. Отримуємо підсумкову таблицю ( табл. 4 ).