Як саме програма спілкується з драйвером пристрою?


12

Тож я розгублений у тому, як саме ми, як програмісти, розмовляємо з пристроями на комп’ютері. Зараз я не кажу про великі ідеї. Я знаю, що є драйвери пристроїв, які сидять на верстаті обладнання, щоб різні програми могли використовувати там функції.

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



1
Трохи і те, і інше, і це залежить від ОС та типу пристрою.
whatsisname

Відповіді:


12

Там, де задіяна операційна система, програми не спілкуються з драйверами пристроїв, принаймні, безпосередньо. Програми розмовляють з абстракціями, які, невідомі їм, врешті-решт розмовляють з драйверами пристроїв через один або кілька шарів абстракції.

Я збираюся пропустити складності сучасних операційних систем і використовувати як приклад CP / M , операційну систему мікрокомп'ютера, розроблену 45 років тому. CP / M являв собою шар торта з трьома шарами:

Програма. Верхній шар - це програма, яка робить щось корисне (обробка тексту, гра в Space Invaders), виконуючи обчислення та введення / виведення. Скажімо, в якийсь момент програма хоче відобразити букву "A", яку бачить користувач. CP / M забезпечує абстракцію, відому як консоль , і саме там повинен шукати користувач, що взаємодіє з програмою. Звичайний спосіб відправити там персонаж - це кілька інструкцій зі складання:

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(Якщо ви не знайомі з ними, регістри можна розглядати як змінні, що живуть в процесорі.) Ми дістанемося до того, які магічні цифри 2і 5все про хвилину. У цьому випадку все, що програма знає, - це те, що є консоль і є спосіб записати її. Він нічого не знає і не піклується ні про що, крім того Це перша з двох абстракцій, які CP / M використовує для вводу / виводу.

BDOS . Адреса, 5яку викликала програма, є точкою входу для наступного шару, Основної дискової операційної системи або BDOS . BDOS пропонує цілий ряд пронумерованих функцій , схожих на впорядкування номерів з меню ресторану. Ви скажете їй, що хочете вивести консоль, завантаживши Cрегістр з номером функції ( 2для виводу консолі) та Eрегістром з символом, який потрібно надіслати. Виведення консолі - це дуже проста операція, і BDOS насправді не має нічого спільного з цим, крім виклику наступного шару.

BIOS. BIOS або Основна система вводу / виводу - це шар, де живе весь кодекс, специфічний для обладнання. У сучасних системах це вважатиметься набором драйверів пристроїв. Як і BDOS, BIOS забезпечує виклики для стандартного набору дуже примітивних операцій, які BDOS використовує для своєї справи. Одна з таких операцій називаєтьсяCONOUT, яка піклується про те, щоб персонаж запросив програму написати два шари вище, до чого б це не робило обладнання. (На відміну від ПК, речі тоді ще не були однорідними. У кожної системи були різні способи зробити це.) Виведення консолі - це просте проходження BDOS, але для чогось більш складного, як створення файлу на диску, може знадобитися багато BIOS закликає маніпулювати медіа. Знову ж таки, оскільки BIOS має стандартний, абстрактний інтерфейс, BDOS завжди знає, як отримати те, що хоче, і не байдуже, як це робить BIOS.

Вам, напевно, цікаво, чому є дві абстракції (програма-до-BDOS та BDOS-до-BIOS) замість однієї. Відповідь полягає в тому, що CP / M та його BDOS можуть надаватися у двійковій формі виробникам комп'ютерів, вони записують власні BIOS з драйверами пристроїв для їх обладнання, з'єднують ці два разом і передають його як ОС для своїх систем. Це було великою справою, оскільки BDOS підтримувався однією організацією, а тому завжди був відомою кількістю програм для користувачів, що дозволяло запускати одні й ті самі програми на дуже широкому (на той час) різноманітному обладнанні. Ось чому існують операційні системи, і ми не просто пишемо програми, які прямо перекручують обладнання .

Все, що я описав тут, стосується і сучасних операційних систем. Наприклад, Unix абстрагує все як файли. Це дає програмує однаковий набір системних викликів ( open(), write(), close()і т.д.) , щоб повідомити , чи є це диск або послідовний порт. Набір рішень та абстракцій набагато складніший, але він все-таки зводиться до вибору того, який код драйвера пристрою в нижньому шарі потрібно запустити, щоб операція відбулася.


Я раніше не дуже переглядав код CP / M (це було трохи раніше мого часу ... Я використовував комп'ютери CP / M, але ніколи не писав для них код), але я дуже здивований використанням call 5тут. Не rst 8було б набагато ефективніше (воно пожертвувало б 3 байтами пам’яті за адресою призначення, але заощаджувало 2 щоразу, коли воно викликається ...)?
Жуль

@Jules: CP / M був розроблений для 8080, який мав лише один режим переривання, коли пристрої переривання ставлять RSTна базі даних однобайтову інструкцію (як правило, а ). Я не можу сказати точно, але, можливо, було недостатньо слотів, щоб покрити потреби всіх пристроїв плюс DDT (які використовували їх для того, щоб відбутися точки прориву), а також використовували один для входу в BDOS .
Blrfl

Ага. Це має сенс, так. Мій 8-бітний досвід розробки обмежений машинами, які мали лише одне джерело переривання, тому не потрібно було так сильно хвилюватися про такі речі ... :)
Jules

Швидке запитання, як цей процес більше стосується ОС Windows та ядра Windows? Або я повинен поставити нове запитання для цього.
Джейсон

@Jason: У Вікіпедії є сторінка, яка описує архітектуру та надає відповідь. Все, що Microsoft виробляв з 1993 року, використовує цю архітектуру. Це майже те саме, тільки з більшою кількістю шарів у торті.
Blrfl

0

Є купа різних можливостей:

  • Для часто використовуваних пристроїв ОС часто включає API, який реалізують драйвери та який адаптує стандартна бібліотека вашої мови. Типові приклади: файлові системи, принтери, мережа, інструменти MIDI.
  • Для більш екзотичних пристроїв виробник пристроїв повинен надавати драйвери, а іноді вони також включатимуть мовні прив’язки до популярних мов. Як мінімум, буде C прив'язки, і майже всі мови мають певний спосіб викликати С бібліотеки.
  • Дещо між цими двома випадками, прості пристрої можуть просто використовувати з'єднання загального призначення, як послідовний порт, і виробник публікує лише той протокол, який потім можна використовувати через загальний драйвер послідовного порту.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.