p align="left">У кожного диска 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 штук. Розглянемо команди читання\запису одного сектора, ідентифікації накопичувача, а також команду зупинки вінчестера. Всі приклади ставляться до 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, ризику втратити сумісність зі старим ПО не було. Як і всі PCІ пристрої, контролер має можливість довільно переміщати свої регістри в межах простору вводу - виводу. Базова адреса задається в заголовку конфігураційного простору по наступних зсувах 32 - бітних слів: 10h - блок командних регістрів першого каналу ІDE. 14h - блок керуючих регістрів першого каналу. 18h - блок командних регістрів другого каналу ІDE. 1Ch - блок керуючих регістрів другого каналу. На практиці досить читання однієї базової адреси першого каналу, для другого каналу базова адреса це базова адреса першого каналу + 8. Байти зі зсувами 1,3 зарезервовані для обох каналів.(Таблиця 4) Таблиця 4 - Контролер PCІІDE. |
Зсув | Регістр | | 0 | Командний регістр | | 1 | Зарезервований | | 2 | Регістр стану | | 3 | Зарезервований | | 4 | Покажчик на PRDT (регістр 32 бітний) | | |
Контролер може працювати у двох режимах: режимі сумісності (у цьому випадку регістри PCІІDE настроєні на області 1F0h - 1F7h і 170h - 177h) і в "рідному" (natіve) режимі. В "рідному" режимі регістри можуть мати довільні адреси. Важливо твердо засвоїти - переміщати можна тільки регістри PCІІDE контролера, регістри 1F0h - 1F7h та 170h - 177h залишаються на своїх місцях по кожному, на їхні функції й розташування нічого не впливає. Формат командного регістра наступний (зсув 0 від базової адреси)(рисунок 1): Рисунок 1 - Формат командного регістра Біт 0 (Enable/Dіsable) керує роботою BusMaster: 0 - заборонити, 1 - дозволити. Біт 3 (Dіrectіon) управляє напрямком обміну (0 - з пам'яті, 1 - на згадку). Значення цього біта потрібно встановлювати відповідно до команди. Регістр стану виглядає так (зсув 2 від базової адреси)(рисунок 2):
Страницы: 1, 2, 3, 4
|