
- •Скидання дискової системи
- •Визначення стану дискової системи
- •Читання сектора
- •Запис сектора
- •Перевірка сектора
- •Форматування доріжки
- •Форматування доріжки нмд
- •Форматування нмд
- •Пошук доріжки (нмд)
- •Читання буферу сектора (нмд)
- •Запис буферу сектора (нмд)
- •Визначення стану нмд
- •Рекалібровка нмд
- •Перевірка пам'яті контролера нмд
- •Перевірка нмд
- •Визначення типу типа нгмд або нмд
- •Перевірка заміни диску
- •Встановлення типу дискети
- •Паркування головок нмд
НЕ 1.4 (Лекція)
Тема: Робота з гнучкими та жорсткими дисками. Форматування дисків.
У розпорядженні програміста є засоби різного рівня, призначені для роботи з дисковою системою. По-перше, люба програма може звертатися безпосередньо до апаратури контролера жорсткого диску чи контролера накопичувача на гнучких магнітних дисках. Це найбільш низький рівень, застосування якого далеко не завжди виправдане. Однак іноді програміст буває вимушений використовувати найнижчий рівень, ризикуючи втратити сумісність з багато чисельними типами дискових контролерів.
По-друге, програма може працювати з дисками за допомогою переривань BIOS. Далі розглянемо різні функції переривання INT 13h, призначені для виконання операцій читання, запису та форматування. Використання функцій переривання INT 13h набагато краще, ніж безпосереднє програмування контролера, так як BIOS приховує особливості апаратної реалізації контролера.
По-третє, програма може звертатися до переривань MS-DOS, спеціально призначених для доступу до дискової системи.
Перші комп’ютери типу IBM PC не мали жорсткого диску (так званого вінчестера чи накопичувача на жорсткому магнітному диску – НМД). Вони були обладнані двома флоппі-дисками (накопичувачами на гнучких магнітних дисках – НГМД), котрі й являли собою дискову систему.
Ці накопичувачі підключені до контролера – спеціального приладу, що виконує функції управління. Контролер зазвичай являє собою плату, що вставлена в роз’єм системної шини, який знаходиться на основній платі комп’ютера.
Об'єм сучасних накопичувачів складає сотні гігабайт.
Що являє собою диск?
Дискета (флоппі-диск) – це кругла пластина в квадратному конверті, з двох боків вкрита магнітним матеріалом. Цей матеріал схожий на той, що використовується в магнітних стрічках звичайних магнітофонів. Ближче до центру в диску знаходиться маленький отвір, призначений для синхронізації. Коли дискета вставляється в дисковод, з обох боків (зверху та знизу) до неї притискаються магнітні головки. При цьому ніякого зазору між поверхнею дискети та головками. За допомогою спеціального покрокового двигуна головки можуть переміщуватися стрибкоподібно уздовж радіуса диску.
Жорсткий диск складається з багатьох жорстких круглих пластинок, вкритих магнітним матеріалом. Пластинки крутяться з величезною швидкістю ( 3600 - 20000 обертів на хвилину) в геометричному корпусі. Біля кожної пластини розташовано по одній магнітній голові, але вони не торкаються диску а «плавають» дуже близько до його поверхні.
Подаючи команди дисковому контролеру, програма може переміщувати блок головок уздовж радіуса диску, переходячи таким чином від одного циліндра до іншого. Переміщуючись уздовж кола диску, магнітна головка може записувати або зчитувати інформацію. Запис виконується по бітам, при цьому додається різноманітна службова інформація та інформація для контролю даних.
Дані записуються не суцільним потоком, а блоками деякого розміру. Ці блоки називаються секторами. Сектор представляє собою найменший об’єм даних, який записується чи зчитується контролером.
Для кожного сектору виконується контроль запису та читання. При запису сектора вираховується контрольна сума всіх байтів, що знаходяться в секторі, і ця контрольна сума записується на диск в службову частину, розміщену після сектору. При читанні ця контрольна сума вираховується заново і порівнюється з контрольною сумою, зчитаною з службової області. При неспівпадінні контролер повідомляє програму про помилку.
Доріжки нумеруються починаючи з нульової, головки також починаючи з нульової, а ось сектори – починаючи з першого. Для правильної роботи з дисками на фізичному рівні програма повинна знати суттєво більше інформації про диски, ніж просто номер потрібної доріжки чи головки. Наприклад, вона повинна знати скільки головок та скільки доріжок має той чи інший дисковий пристрій, скільки байт знаходиться в одному секторі та багато іншого.
Програмування контролера НГМД
Більшість дискових операцій можна виконати на рівні функцій BIOS. Це найбільш простий та надійний спосіб роботи на фізичному рівна. Однак в окремих випадках вам може знадобитися безпосередній доступ до контролера НГМД – наприклад, якщо ви розробляєте систему захисту даних від несанкціонованого копіювання.
Формат доріжки дискети
Для кращого розуміння роботи контролера наведемо схему розміщення зон даних на доріжці дискети (мал. 1).
Кожний сектор на доріжці складається з областей індексу та даних. Сектори розділені проміжками. В кінці доріжки розміщується кінечний проміжок, його розмір залежить від швидкості обертання диску, довжин секторів та інших проміжків. Область індексу містить інформацію про номер доріжки, головки, сектору, код довжини сектора. Область даних, очевидно, містить дані, котрі зберігаються на диску. Приведемо формат сектора (мал. 2)
Мал. 1. Схема розміщення зон даних на доріжці дискети
Мал. 2. Формат сектора
Функції BIOS для роботи з дискети
Найкращий і найбільш безпечний спосіб роботи з дисками на фізичному рівні – використання функцій базової системи вводу/виводу BIOS. Ці функції враховують всі особливості апаратури і надають достатньо широкий набір засобів доступу до дисків на фізичному рівні.
Вся дискова підсистеми обслуговується перериванням INT 13h. Це переривання виконує багато функцій. Для виклику деякої функції програма повинна занести її номер в регістр AH. При цьому в інші регістри слід записати параметри – номер НМД чи НГМД, номер циліндра, головки, адресу таблиць параметрів НМД чи НГМД і так далі.
Бібліотека системи Borland C++ містить спеціальну функцію _bios_disk, котра сильно спрощує роботу з дисковими функціями BIOS. Приведемо коротку таблицю функцій переривання INT 13h.
Номер функції |
Опис |
00h |
Скидання дискової системи |
01h |
Визначення стану дискової системи |
02h |
Читання сектора |
03h |
Запис сектора |
04h |
Перевірка сектора |
05h |
Форматування доріжки |
06h |
Форматування доріжки НМД |
07h |
Форматування НМД |
08h |
Отримати поточні параметри НГМД або НМД |
09h |
Ініціалізація таблиць параметрів НМД |
0Ah |
Читання довге (тільки для НМД) |
0Bh |
Запис довгий (тільки для НМД) |
0Ch |
Пошук циліндра (тільки для НМД) |
0Dh |
Альтернативне скидання НМД |
0Eh |
Читання буфера сектора (тільки для НМД) |
0Fh |
Запис буфера сектора (тільки для НМД) |
10h |
Перевірка готовності НМД |
11h |
Рекалібровка НМД |
12h |
Перевірка пам'яті контролера НМД |
13h |
Перевірка НМД |
14h |
Перевірка контролера НМД |
15h |
Отримати тип НМД або НГМД |
16h |
Перевірка заміни диска |
17h |
Встановлення типу дискети |
18h |
Встановлення середовища носія даних для форматування |
19h |
Паркування головок (тільки для НМД) |
1Ah |
Форматування НМД з інтерфейсом ESDI |
Скидання дискової системи
На вході: |
AH |
00h |
|
DL |
Адреса пристрою НМД або НГМД (0, 1, ..., 80h, 81h, ...) |
На виході: |
- |
|
Примітка: |
|
PC, XT, AT, PS/2 |
Ця функція визиває скидання та рекалібровку дискового контролера (в ході цієї процедури головки встановлюються на нульову доріжку). Якщо в байті адреси старший біт (біт 7) встановлено в 1, виконується скидання контролера НМД.
Скидання рекомендується виконувати після того, як виникла помилка при виконанні інших операцій, таких як читання чи запис. Після скидання можна спробувати повторити операцію.
Адреса пристрою, рівний 0, відповідає першому НГМД (А:), 1 – другому (В:) і так далі. Адреса 80h, 81h відповідає першому та другому НМД, відповідно.
Визначення стану дискової системи
На вході: |
AH |
01 |
|
DL |
Адреса пристрою НГМД або НМД (0, 1, ..., 80h, 81h, ...) |
На виході: |
AL |
Стан пристрою після завершення останньої операції |
Примітка: |
|
PC, XT, AT, PS/2 |
Ця функція можу бути використана для аналізу результату виконання операції та отримання коду помилки. Функція бере переданий в регістрі AL код помилки із області даних BIOS (байт за адресою 0000h:0441h).
Код помилки може приймати значення:
Значення |
Опис |
00h |
Успішне завершення операції |
01h |
Неправильна команда |
02h |
Не знайдена адресна мітка |
03h |
Спроба запису на диск, захищений від запису |
04h |
Сектор не знайдено |
05h |
Помилка при скиданні НМД |
06h |
Відбулася заміна дискети |
07h |
Неправильні параметри НМД |
08h |
Переповнення каналу прямого доступу ПДП при роботі з НГМД |
09h |
Перехід за границю 64 Кбайт при роботі з ПДП |
0Ah |
Виявлено поганий сектор (тільки для НМД) |
0Bh |
Виявлено погану доріжку (тільки для НМД) |
0Ch |
Неправильний номер доріжки |
0Dh |
Неправильний номер сектора при форматуванні (тільки для НМД) |
0Eh |
Виявлено адресну мітку управляючих даних (тільки для НМД) |
0Fh |
Помилка ПДП при роботі з НМД |
10h |
Виявлено помилку в контрольній сумі CRC /ECC |
11h |
Дані скоректовані з використанням ECC (тільки для НМД) |
20h |
Збій контролера |
40h |
Збій при пошуку доріжки |
80h |
Таймаут - програма не встигає обробляти дані |
AAh |
НМД не готовий |
BBh |
Невідома помилка (тільки для НМД) |
CCh |
Збій при записові (тільки для НМД) |
E0h |
Помилка регістру стану НМД |
FFh |
Помилка операції читання (тільки для НМД) |