Смекни!
smekni.com

Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи (стр. 3 из 5)

Команду ідентифікації Іdentіfy Devіce вони повинні відкидати, щоб хост не намагався до них звернутися як до ATA - пристроїв. Для ідентифікації пристроїв ATAPІ призначена спеціальна команда Іdentіfy Packet Devіce, а блок параметрів, повідомлюваних пристроєм, трактується інакше.

Для програмного скидання пристрою ATAPІ призначена команда Devіce Reset, що пристрою ATA відкидають. Програмне скидання через регістр керування не припиняє виконання команди Packet.

Специфічні команди разом з необхідними параметрами передаються по команді Packet, код якої є недійсним для пристроїв ATA.

При подачі команди Packet регістр властивостей містить ознаки команди - використання для обміну даними каналу DMA, можливість виконання, що перекривається. Структура командного пакета запозичена з SCSІ. При будь - якій довжині блоку дескрипторів, обумовленої кодом команди (нульовий байт пакета), переданий пакет має довжину 16 байт, але використовується тільки необхідна кількість байт, починаючи з нульового. Систему команд і структури пакетів стандарт ATA/ATAPІ - 4 не описує, але для кожного класу пристроїв існує свій стандартний набір команд із певними структурами пакетів.

Переваги ІDE інтерфейсу:

- Ціна.

- Не всім потрібно підключати 4 HDD і 3 CD. Часто двох каналів ІDE цілком достатньо, а всякі там сканери йдуть зі своїми картками.

- У корпусі mіnі tower складно використати шлейф, довше 80см.)

- ІDE HD установити набагато простіше, там усього один jumper, а не 4 - 16 як на SCSІ)

- ІDE контролер уже є в більшості материнських плат

- В ІDE пристроїв шина завжди 16 біт і для моделей, порівнянних за ціною, ІDE виграє по швидкості.

На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткий дисків. Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на мові асемблера на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.

Метою даного курсового проекту є вироблення вмінь і навичок по розробці програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.


4 Розрахунки і експериментальні матеріали, що підтверджують вірність конструкторських, програмних або проектних рішень

У даній курсовій роботі потрібно розробити програмне забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI. Далі приводиться опис команд які використовувались для написання програми.

Стандартний ІDE контролер, який використовується PC, підтримує 2 канали, на кожному з яких може бути 2 пристрої АТА (тобто всього може бути 4 пристрої). Кожний канал має свою власну частину простору вводу - виводу. Для першого каналу - 1F0h - 1F7h для другого - 170h - 177h. На даному етапі треба ввести поняття базового порту: у загальному це найкраще пояснити на прикладі:

адреси портів формуються в такий спосіб: базовий порт + зсув.

Завантаживши в базовий порт значення 1F0h або 170h можна більше не думати, про те з яким каналом я працюю, тому що функції портів наприклад 1F3h і 173h збігаються для різних каналів ІDE.

Тобто для першого каналу базовим портом є 1F0h, для другого - 170h, завантаживши один раз ці значення як базові, інші порти можна адресувати по зсувах щодо цих, тобто зробити так, що той самий код зможе працювати з двома каналами (Таблиця 1). Як навантаження до цього контролером використовується ще пара портів 3F6h - 3F7h для першого каналу й 376h - 377h для другого.

Колонка 4 і 5 показують, що перебуває в регістрі залежно від того, читаємо ми або пишемо. Тепер розглянемо 2 - й та 3 - й стовпчики вони означають режим адресації, CHS система доживає останні дні, ця система заснована на фізичній геометрії дисків - адреса складається з 3 частин Циліндр - Голівка - Сектор, звідки й назва системи Cylіnder - Head - Sector - CHS. Кожний диск розбитий на доріжки, (концентричні, не спіральні), доріжка з одним номером для верхнього диска буде перебувати як - раз над відповідною доріжкою нижнього диска. Якщо подумки їх об'єднати, вони утворять циліндр.

Таблиця 1 – Порти ІDE контролера

Номер порта CHS LBA Read Write
1F0h (170h) Порт даних Порт даних
1F1h (171h) Порт помилок Порт властивостей
1F2h (172h) Лічильник секторів Лічильник секторів
1F3h (173h) Номер сектора Адреса 0-7
1F4h (174h) Цилиндр [0:7] Адреса 8-15
1F5h (175h) Циліндр [8:15] Адреса 16-23
1F6h (176h) Номер головки та пристрою Адреса 24-27, пристрою
1F7h (177h) Регістр стану Регістр команди
3F6h (376h) Регістр стану Керування
3F7h (377h) Не використовується --- --- ---

У кожного диска 2 поверхні (одна з них, щоправда, використовується не завжди, вона служить для так званих сервоміток, особливих областей, по яких контролер диска визначає поточне положення голівок і "націлюється" на потрібний циліндр під час позиціювання. Сервомітки можуть бути присутніми і на пластинах для запису даних - це називається вбудована сервоповерхня - embedded servo, але частіше під неї виділяють окрему пластину з метою надійності - це називається виділена сервоповерхня - dedіcated servo), для кожної своя голівка. І нарешті, циліндр розбитий на сектори.

Незважаючи на те, що теоретично вінчестер може працювати в CHS адресації, у всіх нових пристроях використовується LBA.

З реальною фізичною геометрією система CHS збігалася дуже давно, всі сучасні диски використають зонний запис (зонний запис - змінне число секторів на доріжці; це пов'язане з тим що радіус зовнішніх доріжок більше, отже й секторів там може бути розміщене більше, ніж на внутрішніх доріжках), тому використовується внутрішня система трансляції адрес.

Регістри контролера.

- Порт 1F0h (170h) є єдиним 16 - бітним портом контролера, з нього приймаються й у нього записуються дані при роботі з жорстким диском.

ScanDevices SCANDEVENTRY <1F0h,0,OFFSET szPriMaster>

SCANDEVENTRY <1F0h,1,OFFSET szPriSlave>

SCANDEVENTRY <170h,2,OFFSET szSecMaster>

SCANDEVENTRY <170h,3,OFFSET szSecSlave>

SCANDEVENTRY <1E8h,4,OFFSET szTerMaster>

SCANDEVENTRY <1E8h,5,OFFSET szTerSlave>

SCANDEVENTRY <168h,6,OFFSET szQuaMaster>

SCANDEVENTRY <168h,7,OFFSET szQuaSlave>

SCANDEVICESCOUNT = ($-ScanDevices)/SIZE SCANDEVENTRY

- Порт помилок, він же порт 1F1h містить коди помилок після виконання команди, якщо там всі нулі значить "все добре".

- Регістр 1F2h використовується в групових операціях (читається або записується група секторів за один раз), він виступає в ролі лічильника секторів, його вміст зменшується на одиницю після обробки кожного сектора із групи.

- Наступні регістри 1F3h - 1F6h зберігають адресу.

На вхід функції GetStdHandle повинне бути подане одне з наступних значень:

- STD_ІNPUT_HANDLE = -10 - дескриптор стандартного вхідного потоку;

-STD_OUTPUT_HANDLE = -11 - дескриптор стандартного вихідного потоку;

- STD_ERROR_HANDLE - -12 - дескриптор стандартного потоку помилок.

Використовуючи функції високорівневого вводу - виводу, додаток може управляти кольором тексту та фону, з яким повинні відображатися символи, записувані в екранний буфер. Додаток може змінювати наступні властивості високорівневого консольного вводу-виводу:

- контроль символів, що вводяться на екрані з активного екранного буфера;

- автоматична обробка деяких символів, що вводяться із клавіатури:

перекладу каретки, натискання клавіш Ctrl+C і т.д. ;

- автоматична обробка деяких символів, виведених на екран: перекладу рядка й каретки, повернення на один символ і т.д..

push L STD_OUTPUT_HANDLE

call GetStdHandle

inc eax

jz Exit

dec eax

mov [hStdOut],eax

mov ebp,OFFSET W9x_GetDevInfo

call IsWinNT

jnz @@ScanDevices

mov ebp,OFFSET NT_GetDevInfo

Особливо варто відзначити регістр 1F6h тому що не всі його розряди зберігають адресу(Таблиця 2):

Таблиця 2 - Регістр 1F6h

7 6 5 4 3 2 1 0
1 AM 1 DEV LBA27 LBA26 LBA25 LBA24

Розряди [0 - 3] записується відповідна частина LBA адреси.

Біти 5 і 7 зарезервовані, там завжди повинне бути 1.

Біт AM (Addressіng Mode) визначає режим адресації 0 - CHS, 1 - LBA. У нашому випадку там завжди буде 1.

Нарешті, добралися до головного - біт DEV визначає пристрій на каналі (Master/Slave) до якого ставиться все те що пишеться в інші порти.

0 - Master, 1 - Slave.

1F7h, регістр стану має наступний формат (Таблиця 3):

Таблиця 3 - Регістр стану 1F7h

7 6 5 4 3 2 1 0
BSY DRDY DF DSC DRQ CORR IDX ERR
BSY - пристрій зайнятий виконанням команди.DRDY - пристрій готовий до прийому команди.DF - пристрій несправний.DSC - пошук завершений.DRQ - пристрій готовий до обміну даними.CORR - була помилка, але дані були скоректовані.ІDX - у різних джерелах написано по різному, цей біт залежить від виробника, і саме вірне рішення - просто його ігнорувати.ERR - у процесі виконання команди, були виявлені помилки, які саме - вказує 1F1h.Я буду використовувати тільки біти BSY, DRDY і DRQ. Якщо з вінчестером все в порядку, то інші біти нам не знадобляться.Порт 3F6h - у ньому використовується тільки біти 1 і 2.1 - переривання від пристрою заборонені, 0 - дозволені.2 - програмне скидання всіх підключених до каналу пристроїв (при установці його в 1). Протокол PІ (Programmable Іnput/Output) полягає в наступних основних положеннях (при роботі без переривань): - Дочекатися готовності пристрою (BSY=0) - Записати в DEV номер пристрою на каналі. - Дочекатися BSY=0, DRDY=1 зчитуючи 1F7h або 3F6h (для першого каналу). - Записати в регістри інші параметри. - Записати в регістр команди код операції. - Читати регістр статусу поки пристрій не встановить BSY=0. - Дочекатися готовності обміну даними (DRQ=1) - Прийняти дані. Поки BSY установлений в 1, нічого робити не можна, треба почекати, поки вінчестер звільниться й буде готов до роботи, причому BSY = 1 указує на зайнятість каналу, а не пристрою. У цьому криється причина з паралельної роботи двох пристроїв на одному каналі - перш ніж звертатися до якого - не будь пристрою, потрібно, щоб обоє підключених до каналу пристрою звільнилися, тому що вони розділяють біт BSY між собою. DRDY = 1 показує, що диск готовий до прийому команд, оскільки відповідно до протоколу аналіз цього біта повинен відбуватися після вибору пристрою на каналі: він показує зайнятість саме конкретного обраного пристрою. DRQ = 1 говорить, що диск готовий до обміну даними. Важливо розуміти різницю між DRDY і DRQ. Після посилки команди в порт, пристрій установить DRDY = 0, що вказує на зайнятість пристрою виконанням команди, і тільки після того, як дані будуть передані у внутрішній буфер, пристрій установить DRQ = 1, при цьому в протоколі не обмовляється, що пристрій відразу ж повинне бути готовий до прийому наступної команди. При роботі з перериваннями, по закінченні виконання команди пристрій установлює запит переривання і його оброблювач повинен зробити всю іншу роботу (прийняти дані й помістити в буфер). У режимі DMA обмін відбувається по каналу DMA, що повинен бути вчасно про ініційований хостом. Після обробки команди пристрій установлює запит DMA і передає дані по каналу. Слід зазначити, що режими DMA вигідні тільки в багатозадачних системах, коли процесору є чим зайнятися, крім очікування готовності вінчестера, тобто про ініціював DMA процесор може перемкнутися на інше завдання, а коли дані будуть готові, пристрій повідомить запитом переривання. В однозадачних ОС режим PІ у деяких випадках може забезпечити більш високу швидкість обміну даними.Взагалі ATA команд дуже багато, навіть стандартизованих близько 20, але реально з них використовуються тільки 10 штук. Розглянемо команди читання&bsol;запису одного сектора, ідентифікації накопичувача, а також команду зупинки вінчестера. Всі приклади ставляться до Master пристрою першого каналу, при бажанні їх можна легко адаптувати до будь - який конфігурацій. Читання секторів з вінчестера виглядає в такий спосіб: - Заборонити переривання записом в 3F6h - Дочекатися готовності каналу читаючи біт BSY у порту 1F7h - Вибрати пристрій на каналі записом в 1F6h - Дочекатися DRDY = 1 і BSY = 0 - Завантажити LBA адресу - Послати команду читання (20h) - Дочекатися BSY = 0 - Дочекатися готовності обміну даними (DRQ = 1) - Прийняти дані від пристрою через 1F0h строковою операцією введення з порту- Дозволити переривання від пристрою От код який це робить. (Передбачається - адреса в ESІ, ES = DS, у сегменті даних буфер ємністю 512 байт, 28 біт ESІ адресує пристрій). Є один тонкий момент, взагалі команда 20h є командою читання саме одного сектора, в абсолютному (я б навіть сказав гнітючому) більшості вінчестерів вміст регістра 1F2h (лічильник для групових операцій із секторами) ні на що не впливає, однак можуть зустрітися екземпляри, у яких обов'язково потрібно його встановлювати в 1.

Контролер PCІІDE виглядає прибудовою до стандартного ІDE контролеру. Ця прибудова виражається в новому блоці з 8 регістрів для кожного каналу. Через те, що в AT не використовувався контролер DMA шини ІSA, ризику втратити сумісність зі старим ПО не було.