ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Драйвер жорсткого диска
         

     

    Інформатика, програмування

    ТЕХНІЧНЕ ЗАВДАННЯ

    Розробити завантаження драйвер жорсткого диска

    Зміст


    | | # Cтр. |
    | Технічне завдання | 1 |
    | Зміст | 2 |
    | Вступ | 3 |
    | Основна частина | |
    | Структура завантаження драйвера | 3 |
    | Зв'язок драйвера з операційною системою | 6 |
    | Ініціалізація драйвера | 8 |
    | | |
    | Розмітка диска | 9 |
    | Контролер жорстких дисків для АТ-подібних ПЕОМ | 11 |
    | Опис портів введення-виведення | 11 |
    | Система команд | 12 |
    | Отримання блоку параметрів BIOS | 13 |
    | | |
    | Підключення драйвера | 15 |
    | | |
    | Висновок | 16 |
    | Список літератури | 17 |
    | Програми | |
    | Лістинг програми | 18 |

    Введення


    Фірми-розробники апаратного забезпечення постійно удосконалюють зовнішніпристрої та інші вузли персонального комп'ютера. Постійно з'являютьсянова периферійна апаратура й нові модифікації вже існуючихпристроїв. Старі пристрої наділяються новими можливостями, нові роблятьтаке, про що раніше не доводилося і мріяти.
    Інтуїтивно ясно, що повинна бути якась програмна прошарокміж апаратним та програмним забезпеченням, що виконує "погоджують" і
    "уніфікує" дії. Цей прошарок працює безпосередньо з апаратурою, априкладне (та й системне) програмне забезпечення має справу тільки зцієї інтерфейсній прошарком.
    Операційна система MS-DOS, що працює на комп'ютерах фірми IBM абосумісних з ними, теж використовує механізм драйверів.
    Однак драйвери MS-DOS не завжди звертаються безпосередньо до апаратури. Зазвичайвони викликають функції BIOS, і вже BIOS виконує всі дії повведення/висновку. Звичайно, BIOS містить програми обслуговування тількистандартних пристроїв введення/виводу, нестандартні пристрої обслуговуютьсядрайверами напряму.
    Використання BIOS як додаткового інтерфейсу між драйверамистандартних пристроїв і апаратурою різко підвищує "живучість" MS-DOS на нецілком сумісні з IBM персональних комп'ютерах. І це дійсно так
    - Найпоширеніша на сьогоднішній день операційна система MS-DOSверсії 3.30 працює на всіх комп'ютерах, хоч скільки-небудь сумісних з
    IBM PC.
    Це можливо завдяки тому, що виробники сумісних комп'ютеріввраховують у програмах BIOS всі апаратні особливості, і DOS "не бачить"відмінностей. А прикладна програма - тим більше.
    Чому ж цей спосіб не використовується в операційних системах UNIX або
    OS/2? Справа в тому, що на жаль, програми BIOS не єреентерабельнимі. Це не має значення для однозадачной MS-DOS, амультизадачності операційні системи змушені самі організовуватиобслуговування апаратури реентерабельним способом. (Існують ще проблемиподілу ресурсів між паралельно що виконуються процесами, якітеж не вирішуються в рамках BIOS).
    Таким чином, незалежність апаратного і програмного забезпечення в DOSзабезпечується, з одного боку, BIOS для стандартних пристроїв, з іншогобоку - драйверами.
    Користувачі можуть легко доповнювати операційну систему своїми драйверами,складеними для нестандартних пристроїв. Можлива також замінастандартних драйверів, заміна або розширення функцій BIOS.

    Структура завантаження драйвера

    Іноді кажуть, що драйвери - це різновид COM-програм, але це нетак. Швидше спосіб отримання завантажувального модуля драйвера схожий на спосіботримання програми у форматі COM. Є ще одна подібність драйверів іпрограм у форматі COM (що якраз і з'являється з-за однаковогоспособу їх отримання) - завантажувальні модулі цих програм є точнимвідображенням вихідного тексту на мові асемблера без додавання будь-якихкеруючих блоків в початок файлу, як це відбувається в програмах формату
    EXE
    Але, виявляється, керуючий блок на самому початку модуля драйвера є.
    Це так званий заголовок драйвера. Тільки на відміну від програм формату
    EXE, цей заголовок створюється не редактором зв'язку, а самим програмістом іслід помістити в самий початок вихідного тексту програми-драйвера.
    При завантаженні драйвера в пам'ять заголовок драйвера теж поміщається воперативну пам'ять, і в ньому операційна система робить деякізміни, про які ми ще будемо говорити.
    Таким чином, можна говорити і про подібність драйвера з програмами у форматі
    EXE, так як на початку завантажувального модуля драйвера є керуючийблок. Тільки цей керуючий блок на відміну від заголовку EXE-файлує приналежністю самої програми і завантажується разом з нею впам'ять. Заголовок EXE-програми використовуються при запуску EXE-програми, алепісля завантаження операційна система прибирає його з пам'яті.
    Не варто намагатися запускати драйвер як програму у форматі COM, так якуправління буде передано в область пам'яті, що містить заголовок драйвера,а там немає правильних машинних команд. Тому зазвичай файли драйверів маютьрозширення імені, відмінні від COM або EXE. Найчастіше використовуютьсярозширення SYS, DRV, іноді BIN. Насправді розширення імені можназадавати будь-яке, тому що при описі драйвера у файлі CONFIG.SYSвказується його повне ім'я.
    Для драйвера ніколи не створюється префікс програмного сегменту PSP. Упочатку вихідного тексту програми-драйвера не ставиться директива ORG 100H,як це робиться для COM-програми, тому що не треба резервувати місце для
    PSP.
    Що ж представляє із себе завантажувальний модуль драйвера?
    Як вже було сказано, на початку модуля знаходиться заголовок драйвера. Ми вжетрохи говорили про нього при описі векторної таблиці зв'язку операційноїсистеми. Наведемо формат заголовка:
    | (0) | next | вказівник на заголовок наступного драйвера. Якщо зсув адреси |
    | 4 | | наступного драйвера одно FFFF, це останній драйвер в ланцюжку |
    | (+4) | Attrib | атрибути драйвера |
    | 2 | | |
    | (+6) | Strate | зміщення програми стратегії драйвера |
    | 2 | g | |
    | (8) | interr | зміщення програми обробки переривання для драйвера |
    | 2 | upt | |
    | (10 | dev_na | ім'я пристрої для символьних пристроїв або кількість обслуговуваних |
    |) 8 | me | пристроїв для блочних пристроїв. |


    Як вже було сказано, всі драйвери пов'язані в ланцюжок. Найперший драйверзнаходиться відразу за векторної таблиці зв'язку. Поле next заголовка драйверавказує на наступний драйвер (на його заголовок). Це поле має формат
    DWORD-покажчика і складається з компоненти адреси сегмента і зміщення.
    Ознакою того, що даний драйвер останній у ланцюжку, служить значення
    0FFFFh в компоненті зміщення поля next.
    Програміст, коли він складає програму-драйвер, заносить в це поле або
    0FFFFh: 0FFFFh, якщо вихідний текст містить тільки один драйвер, або адресанаступного драйвера (у вигляді далекої посилання на мітку заголовка наступногодрайвера). Якщо вихідний текст містить декілька драйверів, то в заголовкуостаннього в поле next повинне знаходитися значення 0FFFFh: 0FFFFh.
    При завантаженні драйверів в пам'ять операційна система змінить вмістполя next в заголовках драйверів для того, щоб це поле вказувало назаголовок наступного драйвера в ланцюжку. (Чи змінить в пам'яті, а не у файлідрайвера!)
    Зазвичай вихідний текст програми містить один драйвер, і поле next задаєтьсянаступним чином:

    next DD 0FFFFFFFFh

    Наступне поле в заголовку драйвера - поле атрибутів драйвера atrib.
    Це поле описує пристрій, що обслуговує даними драйвером. Кожен бітслова відповідає за ту чи іншу особливість пристрою. Перш ніж мидетально розглянемо призначення всіх бітів цього слова, зауважимо, що біт 15
    (найстарший біт) вказує, чи є цей пристрій символьним абоблоковим.
    Для драйверів блочних пристроїв формат слова атрибутів:
    | Біт | Призначення |
    | 0 | Зарезервовано, біт повинен бути дорівнює 0 |
    | 1 | 1 - драйвер підтримує 32-бітову адресацію сектора (для версій DOS, |
    | | Починаючи з 4.00 і більш пізніх); якщо встановлений цей біт, поле номера |
    | | Сектору всіх запитів є подвійним словом, додаються в кінець заголовка |
    | | Запиту, старе поле номера сектора має містити -1); |
    | | 0 - використовується 16-бітова адресація сектора |
    | 2-5 | Ці біти зарезервовані і повинні бути рівні 0 |
    | 6 | 1 - підтримуються логічні пристрої (використовується блочними драйверами |
    | | Для управління "віртуальними" флоппі-дисками, створювані драйвером |
    | | DRIVER.SYS в DOS версії 3.2 і пізніших версіях); |
    | | 0 - логічні пристрої для блочних драйверів не підтримуються; |
    | 7-1 | Ці біти зарезервовані і повинні бути рівні 0 |
    | 0 | |
    | 11 | 1 - одиниця в цьому бите означає, що драйвер підтримує функцію перевірки |
    | | Заміни носія даних у пристрої (наприклад, заміни дискети); використовується |
    | | Для DOS версій 3.00 і більш пізніх; |
    | | 0 - для блочних пристроїв функція перевірки заміни носія даних не |
    | | Підтримується |
    | 12 | Зарезервовано, біт повинен бути дорівнює 0 |
    | 13 | 1 - драйвер не використовує стандартне IBM-пристрій, і необхідно видати |
    | | Запит на побудову блоку параметрів BIOSBIOS BPB; |
    | | 0 - використовується IBM-пристрій |
    | 14 | 1 - підтримуються функції IOCTL; |
    | | 0 - функції IOCTL не підтримуються |
    | 15 | 1 - символьне пристрій; |
    | | 0 - блоковий пристрій |


    Після слова атрибутів драйвера знаходяться два дуже важливих поля: зсувпрограми стратегії драйвера strateg і зміщення програми обробкипереривання interrupt.
    Ці дві програми використовуються DOS для організації звернення до драйвера.
    Для звернення до драйвера DOS формує у своїй області даних запит,що складається із заголовка стандартного формату і змінної частини запиту,довжина і формат якої залежать від типу запиту. Після цього DOS зчитуєіз заголовка драйвера значення зміщення програми стратегії і передає їйуправління, записавши в регістри ES: BX адресу заголовка запиту.
    Завдання програми стратегії - запам'ятати цю адресу всередині тіла драйвера дляподальшого використання або організувати чергу запитів обслуговування.
    Відразу після виклику програми стратегії DOS викликає програму обробкипереривань, визначивши її адресу з поля interrupt заголовка драйвера.
    Програма обробки переривання витягує тільки що записаний програмоюстратегії адресу заголовка запиту і виконує ту функцію, номер якоїзаписаний у запиті. Номер функції знаходиться в заголовку запиту.
    Результати виконання функції програма переривання записує у спеціальновідведені поля заголовка запиту, і на цьому процедура звернення до DOSдрайверу завершується.
    Формат заголовка запиту буде наведено нижче, а зараз покажемо, як узаголовку драйвера задаються зсуву програм стратегії і переривання:

    strateg DW strateg_procinterrupt DW interrupt_proc

    Останнє поле заголовка драйвера dev_name має різну інтерпретаціюдля символьних і блокових пристроїв.
    Для символьних пристроїв у цьому полі має розташовуватися вирівняне полівому краю і доповнене до восьми символів пробілами ім'я пристрою. Цеім'я буде використовуватися для звернення до драйвера. Якщо Ви збираєтесязамінити драйвер стандартного символьного пристрої DOS на свій, Ви повиннізаписати ім'я пристрою великими літерами:

    dev_name DB 'AUX'

    Для блочних пристроїв перший байт поля dev_name містить кількістьпристроїв, що обслуговуються даними драйвером, інші сім байтів НЕвикористовуються:

    dev_name DB 1

    DB 7 dup (?)

    Таким чином, ми з'ясували, що драйвер містить на самому початку заголовок,і десь далі повинні розташовуватися програми стратегії і переривання. (Неслід плутати програму переривання драйвера з програмою обслуговуванняапаратних чи програмних переривань. Хоча програма переривання драйвератрохи схожа на обробник програмних переривань, призначення цієїпрограми та механізм її використання абсолютно інший).
    Що ще може знаходитися в програмі-драйвері?
    Це можуть бути області даних, що використовуються драйвером, і підпрограми,викликаються програмами стратегії і переривання. Іноді стандартні драйвериперепризначає на себе деякі вектора переривань, і тоді вони містять всобі обробники цих переривань. В області пам'яті, відведеної операційноїсистемою драйверу, може розташовуватися стек драйвера, якщо розмірсистемного стека недостатній.
    На довжину драйвера накладається таке ж обмеження, як і на довжину COM -програм - 64 кілобайт, то є один сегмент.

    Зв'язок драйвера з операційною системою

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

    next DD 0FFFFFFFFhattrib DW 8000hstrateg DW strateg_procinterrupt DW interrupt_procdev_name DB 'TESTDRV'

    Це символьний драйвер (старший біт поля attrib дорівнює 1), початковий текстмістить тільки один драйвер (поле next містить значення 0FFFFFFFFh), ім'япристрою, який потрібно буде використовувати при зверненні до драйвера -
    TESTDRV. Назва пристрою не повинне збігатися з ім'ям файлу, який міститьсимвольний драйвер, інакше Ви не зможете звернутися до файлу, наприклад, дляйого перейменування - DOS буде працювати не з файлом, а з пристроєм.
    Як вже було сказано, перед зверненням до драйвера DOS готуєзаголовок запиту в своїй області даних і викликає програму стратегії,витягуючи її зміщення з заголовка драйвера. Програма стратегії звичайнодуже проста, тому що її завдання - запам'ятати адресу заголовка запиту вобласті пам'яті драйвера. Область для зберігання адреси заголовка запитуможе бути визначена наступним чином:req_off DW?req_seg DW?

    Тоді програма стратегії повинна записати вміст регістру ES в полеreq_seg, а регістра BX - у полі req_off:

    strateg_proc: mov cs: req_off, bx mov cs: req_seg, es ret

    Драйвер складається з одного сегмента кодів, тому для адресації данихвикористовується сегментний регістр CS.
    Запит операційної системи до драйвера соcтоіт із заголовка, що маєфіксований формат і довжину 13 байт, і змінної частини, розмір і форматякої залежить від виконуваної функції.
    Наведемо формат заголовка запиту:
    | (0) | size | Довжина запиту в байтах (довжина заголовка запиту плюс довжина змінної |
    | 1 | | частини запиту) |
    | (1 | unit | Номер пристрою (використовується для блочних пристроїв, вказує, з яким |
    |) 1 | | саме пристроєм, обслуговується драйвером, буде працювати операційна |
    | | | Система) |
    | (2 | cmd | Код команди, яку необхідно виконати (може мати значення від 0 до |
    |) 1 | | 18h) |
    | (3 | statu | Слово стану пристрою, заповнюється драйвером перед поверненням |
    |) 2 | s | управління операційній системі |
    | (5 | reser | Зарезервовано |
    |) 8 | ved | |


    Після виклику програми стратегії DOS передає керування програміпереривання (без параметрів). Завдання програми переривання - виконатикоманду, код якої знаходиться в полі cmd заголовка запиту. Якщо драйверблочного пристрою обслуговує декілька логічних пристроїв, то в поліunit знаходиться номер пристрою, для якого необхідно виконати команду.

    Залежно від виконуваної команди запит може містити іншуінформацію, необхідну для виконання команди.
    Як результати виконання команди повертаються DOS?
    Дані (або адреси даних), отримані драйвером від фізичного пристроювведення/виводу, містяться в область змінної частини запиту. Крім того,драйвер повинен встановити слово соcтоянія пристрої status у заголовкузапиту відповідно до результатів виконання команди.
    Наведемо формат слова стану пристрою:
    | Бі | Призначення |
    | т | |
    | 0 - | Код помилки пристрою (якщо команда виконана з помилкою і драйвер встановив |
    | 7 | ознака помилки (біт 15) за одиницю, в це поле він повинен записати код помилки). |
    | 8 | Команда виконана. Цей біт завжди встановлюється драйвером перед тим, як він |
    | | Повертає керування операційній системі. |
    | 9 | Зайнято. Цей біт встановлюється обробником команди, коли фізична |
    | | Пристрій зайнятий виконанням попередньої операції і тому не може виконати |
    | | Необхідну команду. Цей біт використовується також для передачі такої інформації, |
    | | Як "буфер клавіатури не пустий", "Середа носія даних замінена" (в команді |
    | | Перевірки можливості заміни середовища носія даних). |
    | 10 | Зарезервовано. |
    | -1 | |
    | 4 | |
    | 15 | Ознака помилки. Встановлюється драйвером, коли він не може обробити запит |
    | | Або виникла фізична або логічна помилка при обробці правильного |
    | | Запиту. Бити 0-7 при цьому повинні мати код помилки. |


    Наведемо таблицю можливих кодів помилок:
    | Ко | Опис |
    | д | |
    | 0 | Порушення захисту від запису. Була зроблена спроба запису інформації на |
    | | Захищений від запису пристрій. |
    | 1 | Невідоме пристрій. |
    | 2 | Пристрій не готовий. |
    | 3 | Невідома команда. Затребувана команда не підтримується драйвером. |
    | 4 | Помилка CRC. При виконанні команди вияв?? єна помилка циклічного коду |
    | | Перевірки. |
    | 5 | Неправильна довжина запиту. Поле довжини в заголовку запиту містить невірне |
    | | Значення. |
    | 6 | Помилка при пошуку доріжки (доріжка не знайдено). |
    | 7 | Невідомий носій даних. |
    | 8 | Сектор не знайдено. |
    | 9 | Ні паперу в принтері. |
    | 0A | Помилка запису. |
    | h | |
    | 0B | Помилка читання. |
    | h | |
    | 0C | Загальна помилка. |
    | h | |
    | 0D | Зарезервовано. |
    | h | |
    | 0E | Зарезервовано. |
    | h | |
    | 0F | Недозволеним заміна диска (тільки для DOS версії 3.0 і пізніших версій). |
    | h | |


    Загальна схема дій програми переривання драйвера така:

    . отримавши управління від операційної системи, програма переривання зберігає вміст всіх регістрів процесора і зчитує номер команди із заголовка запиту;

    . при необхідності програма зчитує додаткову інформацію з області запиту;

    . затребувана команда виконується (якщо вона підтримується драйвером);

    . якщо драйвер зчитує будь-які дані від обслуговується фізичного пристрою для передачі їх DOS, то самі дані або їх адреси програма переривання записує в область запиту;

    . програма переривання встановлює слово стану пристрою відповідно до результатів виконання команди (якщо драйвер не підтримує викликану команду, в слові стану пристрою встановлюються біти 15 і в біти 0-7 записується код помилки 3 - невідома команда);

    . відновлюється вміст регістрів процесора, і управління повертається операційній системі за допомогою команди повернення з далекого процедури.

    Ініціалізація драйвера

    Ця функція виконується тільки один раз при завантаженні драйвера і підключеннійого до операційної системи.
    Функція ініціалізації повинна підтримуватися будь-яким драйвером, тому що вонаповідомляє операційній системі відомості, необхідні DOS для правильногопідключення та використання драйвера.
    Наведемо формат запиту для команди ініціалізації:
    | (0) | head | Заголовок запиту. |
    | 13 | er | |
    | (1 | n_un | Кількість пристроїв, що обслуговуються драйвером. Це поле заповнюється |
    | 3) | its | тільки блоковим драйвером. |
    | 1 | | |
    | (1 | end_ | Кінцевий FAR-адреса резидентної частини коду драйвера. У це поле драйвер |
    | 4) | addr | записує адресу байта пам'яті, наступного за тією частиною коду драйвера, |
    | 4 | | яка повинна стати резидентної. |
    | (1 | parm | FAR-адреса рядка параметрів ініціалізації драйвера з файлу CONFIG.SYS. |
    | 8) | | Цей рядок містить все, що знаходиться в рядку файлу після команди |
    | 4 | | 'DEVICE =', вона закінчується символами переведення рядка і повернення |
    | | | Каретки 0Ah, 0Dh. При поверненні драйвер блочного пристрою повинен |
    | | | Записати в це поле адреса масиву покажчиків на блоки параметрів |
    | | | BIOSBIOS (BPB), по одному вказівником на кожен пристрій, що обслуговує |
    | | | Драйвером. |
    | (2 | driv | Номер пристрою. Для версії DOS 3.0 і більш пізніх версій в це поле |
    | 2) | e | при завантаженні драйвера операційна система заносить номер, призначений |
    | 1 | | пристрою, обслуговується драйвером. Наприклад, для влаштування А: це 0, |
    | | | Для B: - 1 і т.д. |

    При ініціалізації драйвер символьного пристрої зберігає у своїйвнутрішній області даних параметри ініціалізації, використовуючи адресу parm.
    Якщо параметри містять числові величини, програма ініціалізації можепровести їх перекодування й зберегти значення в двійковому форматі.
    Потім драйвер може виконати ініціалізацію обслуговується фізичногопристрої введення/виводу, ініціалізацію своїх внутрішніх змінних, вивестина екран будь-які листи або навіть запросити в операторадодаткові дані - функція ініціалізації може користуватися дляорганізації діалогу з оператором та інших дій функціями переривання 21hз номерами від 01h до 0Ch, 25h, 30h, 35h і функціями BIOS.
    Крім цього, драйвер повинен заповнити поле end_addr адресою кінцярезидентної частини драйвера. Так як програма ініціалізації виконуєтьсятільки один раз, зазвичай її розташовують у кінці драйвера і для економіїпам'яті не залишають резидентної.
    Драйвери блочних пристроїв додатково повинні повернути DOS кількістьобслуговуваних пристроїв (у полі n_units) і покажчик на масив покажчиківна блоки BPB (у полі parm).
    Кількість пристроїв використовується DOS для визначення логічних іменпристроїв. Наприклад, якщо Ваш драйвер обслуговує три логічнихпристрою, і на момент його завантаження в системі є пристрої A:, B: і
    C:, то пристрої, які обслуговуються Вашим драйвером, отримають імена D:, E: і
    F:. Кількість пристроїв необхідно вказувати також і в заголовку драйвера,в першому байті поля імені пристрою dev_name.
    Для кожного логічного пристрою драйвер повинен містити так званийблок параметрів BIOS (BIOS Parameter Block) BPB.
    Блок BPB міститься в завантажувальному секторі диска і містить інформацію,необхідну BIOS для роботи з диском. Наведемо формат BPB:
    | (0) | sect | Кількість байтів в одному секторі диска. |
    | 2 | _siz | |
    | (2) | clus | Кількість секторів в одному кластері. |
    | 1 | tsiz | |
    | (+3) | Res_ | Кількість зарезервованих секторів. |
    | 2 | sect | |
    | (+5) | Fat_ | Кількість таблиць FAT. |
    | 1 | cnt | |
    | (+6) | Root | Максимальна кількість дескрипторів файлів, |
    | 2 | _siz | містяться в кореневому каталозі диска. |
    | (8) | tot_ | Загальна кількість секторів на носії даних (у розділі |
    | 2 | sect | DOS). |
    | (10 | medi | Байт-описатель середовища носія даних. |
    |) 1 | a | |
    | (11 | fat_ | Кількість секторів, займаних однією копією FAT. |
    |) 2 | size | |


    Наведемо фрагмент початкового тексту драйвера, повертає приініціалізації вказівник на масив BPB:

    lea dx, bpb_ptr mov es: [bx +18], dx mov es: [bx +20], cs

    . . . . . . . . . .

    У цьому прикладі передбачається, що ES: BX містить адресу заголовка запиту.

    Розмітка диска

    Дані на жорсткий диск записуються в секторах. Секторарозташовуються на доріжках. Нумерація доріжок починається з зовнішньоїбоку пластини (там розташована нульова доріжка). Кількість пластин
    (дисків) і головок, так само як і Максимальна кількість доріжок, можутьколиватися в досить широких межах і залежать від типу конкретногонакопичувача. Доріжка зазвичай містить від 8 до 26 секторів і дляданого конкретного накопичувача число секторів на доріжці постійно.
    Початок доріжки визначається сигналом "індекс", якийгенерується накопичувачем при кожному обороті диска. Далі йде першимсектор доріжки. Другий сектор буде відстояти від першого на числосекторів, рівне значенню фактора чергування мінус 1, третій ще настільки ж і т. д. Таким чином при факторі чергування рівному 3, сектору на 17-секторною доріжці будутьрозташовуватися таким чином:

    'ДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДВДДї і 1і 7і13і2 і8 і14і3 і9 і15і4 і10і16і 5і11і17і 6і12і
    ГДДБДДБДДБВДБДДБДДБВДБДДБДДБДДБДДБДДБДДБДДБДДБДДБДДґ і і фактор і і і ічер-ня і і і і

    Формат сектора наведено в таблиці.
    'ДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДї іОбозначеніеі Призначення іДліна і і і і (байт) і
    ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДґ і АМ і Адресний маркер і 4 і і ІНТ1 і Інтервал і 9-12 і
    ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДґ і і Поле ідентифікації: і і і СІНХ1 і Сінхробайт і 1 і і ІНТ2 і Інтервал і 2 і і СРВ і Байт для порівняння і 1 і і ЦСБ і Старший байт номера циліндра і 1 і і ЦМБ і Молодший байт номера циліндра і 1 і і ГЛВ і Номер головки і 1 і і сект і Номер сектора і 1 і і ПРАПОР і Флагова байт і 1 і і НУЛЬ і Нульовий байт і 1 і і КС1 і Контрольна сума поля ідентифікації і 4 і
    ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДґ і ІНТ3 і Інтервал і 16 і
    ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДґ і і Область даних: і і і СІНХ2 і Сінхробайт і 1 і і ІНТ4 і Інтервал і 2 і і ДАНІ і Поле даних і 512 і і КС2 і Контрольна сума поля даних і 4 і
    ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДґ і ІНТ5 і Інтервал і 43 і < br> АДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДЩ

    Початок сектора позначається за допомогою унікальноїкомбінації, що називається адресним маркером. П'ять інтервалів,визначених у таблиці ІНТ1 - ІНТ5, заповнюються нулями, причому довжина
    ІНТ2 і ІНТ4 постійна і дорівнює 2 байтам, у той час як ІНТ1, ІНТ3 і
    ІНТ5 можуть мати різну довжину, трохи відрізняється від значень,наведених у таблиці. Ці три інтервали призначені дляпідготовки накопичувача до зчитування (запису) наступного за ним області, а розходження в довжині пояснюється тим, що адресний маркер, полеідентифікації і дані можуть записуватися в різний час поверхраніше наявної інформації, що не забезпечує точного збігуфізичної довжини збережені області і раніше що була на цьому місціобласті.
    Відмінності в довжині можуть становити кілька біт, чим пояснюється наявність після після інтервалів сінхробайта, що дозволяє визначитисправжню початкову межу області і правильно згрупувати всінаступні біти в байтах. Байт СРВ має постійне значення длявсіх секторів і використовується для перевірки правильності зчитуванняполя ідентифікації. Флагова байт містить службову інформацію, вЗокрема відзначає дефектність сектора, якщо він не придатний для запису.
    Контрольні суми служать для перевірки правильності зчитування інформаціїз поля ідентифікації та області даних і обчислюються спеціальнимгенератором кодів корекції помилок (Error Correction Code, ECC) звиробляють поліномом 32-го ступеня.

    Контролер жорстких дисків для АТ-подібних ПЕОМ

    IBM PC AT відрізняється від усіх попередніх моделей IBM PC ісумісних ПЕОМ в наступному:

    - стандартний BIOS забезпечує можливість роботи як знакопичувачами на гнучких, так і з накопичувачами на жорстких дисках;

    - контролери жорстких і гнучких дисків розташовані на одній платі;

    - адреси портів вводу-виводу, призначених для управлінняжорстким диском, і призначення портів повністю відрізняються від ХТ-подібних
    ПЕОМ.

    Можливе підключення до одного ПЕОМ двох жорстких дисків. Кожендиск має свій набір портів (1F0h-1F7h для першого і 170h-177h длядругий). Нижче будуть описані порти тільки першого диска. Призначення портів другого диска аналогічно першим.

    Опис портів вводу-виводу

    Порт 1F0h

    Призначений для обміну даними з внутрішнім ОЗУконтролера, що є проміжною ланкою між оперативною пам'яттю
    ПЕОМ та накопичувачем.

    Порт 1F1h.

    При читанні через цей порт можна отримати інформацію проостанньої виникла помилку:

    7 6 5 4 3 2 1 0
    'ДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДї і і і 0 і і 0 і і і і Біт:
    АДВДБДВДБДДДБДВДБДДДБДВДБДВДБДВДЩ ДДДД і і і і і АТ> 0: 1 = адресний маркер даних не і і і і і знайдений і і і і АДДДДД> 1: 1 = помилка на нульовій доріжці і і і АДДДДДДДДД> 2: 1 = виконання команди сам процес і і і щено програмно, команда і і і не завершилася і і АДДДДДДДДДДДДДДДДД> 4: 1 = ідентифікатор сектора не і і знайдений і АДДДДДДДДДДДДДДДДДДДДДДДДД> 6: 1 = фатальна помилка в дан-і них, помилка контрольної і суми

    АДДДДДДДДДДДДДДДДДДДДДДДДДДДДД> 7: 1 = дефектний сектор

    Порт 1F2h.

    Читання/запис числа секторів для наступної операції.

    Порт 1F3h.

    Читання/запис параметра "номер сектора" для наступної операції.

    Порт 1F4h.

    Читання/запис старших бітів номера циліндра для наступної операції
    (біти 0 - 1 - це біти 8 - 9 в 10-бітове номері циліндра).

    Порт 1F5h.

    Читання/запис молодших восьми бітів номера циліндра длянаступної операції.

    Порт 1F6h.

    Читання/запис номера пристрою й головки для подальшоїоперації.

    Порт 1F7h (запис).

    Висновок команди з управління накопичувачем.

    Порт 1F7h (читання).

    Читання стану накопичувача і результатів попередньої команди:

    7 6 5 4 3 2 1 0
    'ДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДї і і і і і і і і і Біт:
    АДВДБДВДБДВДБДВДБДВДБДВДБДВДБДВДЩ ДДДД і і і і і і і АТ> 0: 1 = попередня команда завер-і і і і і і і шився з помилкою і і і і і і АДДДДД> 1: 1 = сигнал "індекс" і і і і і АДДДДДДДДД> 2: 1 = дані при виконанні пос - і і і і і Ледней операції були скор-і і і і і ректіровани за допомогою і і і і і алгоритму ECC і і і і АДДДДДДДДДДДДД> 3: 1 = йде процес обміну даними і і і АДДДДДДДДДДДДДДДДД> 4: 1 = пошук завершено і і АДДДДДДДДДДДДДДДДДДДДД> 5: 1 = помилка запису і АДДДДДДДДДДДДДДДДДДДДДДДДД> 6: 1 = пристрій готовий для чте-і ня, записи або пошуку

    АДДДДДДДДДДДДДДДДДДДДДДДДДДДДД> 7: 1 = пристрій зайнятий виконан-ням команди (решта біти не несуть смислового навантаження)

    Система команд

    Код команди заноситься в порт 1F7h після того, якпідготовлені всі параметри в портах 1F2h - 1F6h. Виконання командипочинається відразу після занесення в порт 1F7h коду команди. Командаскладається з одного байта. Старші 4 біта містять код потрібноїоперації, молодші містять параметри. Перелік команд з можливимизначеннями параметрів наведено в таблиці.

    'ДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї і Код і Призначення і Параметри і іоперацііі і і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 1 і Рекалібровать (скидання і Період імпульсів сигналу і і і головок на циліндр 0) і "крок" і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 2 і Читання секторів і Бити, що визначають необхід-і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ тість повторних звернень і і 3 і Запис секторів і до диска і повторних спроб і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ зчитування при помилках і і 4 і Перевірка секторів і контрольної суми і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 5 і Форматування дорожкіі Параметр = 0 і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 7 і Пошук циліндра і Період імпульсів сигналу і і і і "крок" і
    ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і 9 і Діагностика і Параметр = 0 і і ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ і і задати параметри і Параметр = 1 і і і накопичувача (максималь-і і і і ве число головок і і і і і секторів) і і
    АДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

    Для отримання інформації про жорсткі дисках, а також їх самодіагностикинеобхідно програмувати IDE контролер. Для того, щоб наведенийвихідний текст модуля був більш-менш зрозумілий, необхідно роз'яснитидеякі принципи програмування IDE контролера. Базовий портвведення/виводу для першого IDE контролера - 1F0h. Ще я використовував портконтролю (3F6h) для скидання стану контролера. Для скидання контролераслужить функція hd_reset (). Так як контролер генерує запит напереривання IRQ14, то є необхідність у функції, яка чекає на переривання відконтролера. Такий функцією служить hd_wait (), вона зупиняє роботусистеми до тих пір, поки не відбудеться переривання від контролера жорсткихдисків або не закінчиться час очікування. Програма правильно обробляє всівикористовувані в програмі IRQ.

    Командування контролером здійснюється через порт 1F7h, у ньогозаписується код відповідної команди і після її внесення до ньогозберігається результат виконання. Обмін даними здійснюється через порт
    1F0h, порт 1F1h служить для видачі помилок, всі інші порти (1F2h-1F6h)для завдання параметрів роботи. Так, наприклад, перед викликом командиотримання інформації в 5й біт порту 1F6h заноситься номер диска,підключеного до першого контролера.

    Після того як у 1F7h послали команду отримання інформації, необхіднодочекатися переривання від контролера, яке вкаже на те, що дискзавершив виконання команди. Отримана інформація зберігається в буфері диска,що зчитується через порт 1F0h. Тепер, наведений нижче, текст станебільш зрозумілим.

    Port Description
    ____< br>______________________________________________________________________< br>1f0H Data register. Read/write data from/to controller sector buffer
    1f1H Write: Write Precompensation register. Turn on writeprecompensation.

    Read: Error register. Contains bits for last error.

    +7-6-5-4-3-2-1-0 +

    | | | 0 | | 0 | | | |

    +---------------+ bit

    | | | | | + - 0: Data Address Mark not found

    | | | | + --- 1: Track 0 Error

    | | | +----- 2: Command was aborted

    | | +----- ---- 4: Sector ID not found

    | +------------- 6: ECC Error: Uncorrectable data error

    + -- ------------- 7: Bad block

    1f2H Sector count. Read/Write count of sectors for operation

    1f3H Sector number. Read/Write current/starting logical sector number
    1f4H Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)

    Отримання блоку параметрів BIOS

    Не розглядаючи механізму повернення BPB, ми повинні вирішитизавдання визначення вмісту блоку параметрів BIOS. Описувані методизастосовні не тільки до команди BUILD BPB, але і до команди INIT. Упростому випадку драйвера пристрою, що підтримує тільки один типносія (наприклад драйвер RAM-диска), вміст

    BPB може бути закодовано в тілі самого драйвера. До нещастя,при роботі з реальними дисками, включаючи жорсткі диски, не все так просто ідрайвер зобов'язаний визначати вміст BPB. Як правило, BPB є частиноюблоку початкового завантаження, як показано на рис.6-7. У цьому випадку драйвер повинен знайти іпрочитати цей блок, вибрати звідти блок параметрів BIOS і повернутиадресу останнього. Практично у всіх?? променя блок початкового завантаженнярозташовується в самому першому логічному секторі диска (тобто сектора,що має номер 0). Перетворення номера логічного сектора вкоординати фізичного сектора залежить від функцій пристрою і повиннобути описано в документації з цього пристрою. Драйвер повинен перевіритиструктуру цього сектора, щоб переконатися, що він дійсно міститьблок початкового завантаження.

    Якщо перший логічний сектор не містить коректного блоку початкового завантаження, наприклад, як в дисках, що відформатували в MS-
    DOS версій до 2.0, то драйвер повинен вважати першим сектор таблицірозміщення файлів (FAT). На щастя, MS-DOS версій до 2.0 підтримувалитільки кілька форматів, кожен з яких визначався в першому секторі
    FAT другу логічного сектора диска. Найперший байт першого сектора
    FAT містить байт описувача носія, який можна використовувати длявизначення відповідного вмісту BPB, що повертається до MS-DOS.
    Версії MS-DOS до 2.0 використовують Описувачі 0FEH і 0FFH.

    ЗСУВУ ЗМІСТ РОЗМІР

    (hex)

    +---------- -----------------------------?

    00 | Команда переходу на код завантажувача | 3 байти

    +---------------------------------------?

    03 | Назва та версія виробника | 8 байт

    ? - +--------------------------- ------------?

    | 0 B | Розмір сектора в байтах | Слово

    | +----------- ----------------------------?

    | 0 D | Кількість секторів у кластері | Байт

    | +---------------------------------------? < p> | 0 E | Кількість зарезервованих секторів | Слово

    БЛОК | +----------------------------- ----------?

    | 10 | Кількість таблиць FAT | Байт

    ПАРАМЕТРІВ -? +---------------------------------------?

    | + 11 | Кількість елементів директорія | Слово

    BIOS | +--------------------------------- ------?

    | 13 | Кількість логічних секторів | Слово

    | +------------------ ---------------------?

    | 15 | Описувач носія | Байт

    | +---- -----------------------------------?

    | 16 | Кількість секторів у однієї FAT | Слово

    ? - +------------------------------------ ---?

    18 | Кількість секторів на доріжці | Слово

    +---------------------- -----------------?

    1 A | Кількість головок читання/запису | Слово

    +------- --------------------------------?

    1 C | Кількість прихованих секторів | Слово

    ?---------------------------------------+

    Малюнок 6-7. Вміст перші 30 байт блоку початкового завантаження

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

    Коротенько, послідовність обробки команди BUILD BPBнаступна:

    1. Драйвер повинен прочитати блок початкового завантаження (звичайно на-ходить в першому логічному секторі диска - сектор # 0) і перевірити його на наявність блоку параметрів BIOS. Якщо BPB про-назовні, то перехід до кроку 3, інакше перехід до кроку 2.

    2. Драйвер повинен прочитати перв

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status