Компьютерные драйвера
Начну я с DOS-овских. Во-первых, я их лучше знаю, потому, что 20 лет назад изучала именно их. Во-вторых, то что сейчас с технической точки зрения можно смело назвать надстройкой над тем, что было тогда, а с логической вообще ничего не поменялось.
Компьютер состоит из процессорного блока, к которому проводами подключены разнообразные устройства (монитор, клавиатура, мышь, принтер и т.д.)
Процессор получает информацию от каких-то устройств и передаёт информацию каким-то другим устройствам. В случае получения информации обычно есть какой-то кусок памяти, в который постоянно записывается то, что передало устройство. При записи – обратный процесс. Надо что-то писать по какому-то адресу в памяти и уже железо (т.е аппаратный уровень) всё это передаст подключенному устройству.
Причём многое там происходит на аппаратно уровне, т.е без участия операционной системы. Операционная система устанавливает некую надстройку, которая позволяет работать со всем этим чуть проще.
Эта надстройка по сути – набор функций, который может использовать программист, желающий чтобы всё оборудование делало то, что он хочет.
Функции – прерывания DOS:
http://www.codenet.ru/progr/dos/
Каждое прерывание обычно работает с каким-то конкретный устройством. Например №10h (“h” означает шестнадцатеричное число) специализируется на работе с экраном, т.е монитором:
http://www.codenet.ru/progr/dos/int_0009.php
Пусть я хочу чтобы на экране во второй строке в 10-й позиции появилась английская буква “a”. Пусть нет у меня даже DOS-а с его функциями – прерываниями. Я знаю, что всё содержимое оперативной память с адреса B800h передаётся на экран. Я знаю, что на одну букву используется два байта информации, а первом – код буквы, во втором – её оформление. Можно, например сделать букву белой на красном фоне. Код буквы «a»=97
http://unicode-table.com/ru/
Ширина экрана в текстовом режиме – 80 букв.
Т.е всё, что мне требуется чтобы получить желаемое записать цифру 97 по адресу B800h+80*2+10*2.
Но уже здесь есть небольшая проблема. Информация с адреса B800h передаётся на цветной монитор. Если же у меня монитор чёрно-белый, то мне надо использовать адрес B000h.
Если же я использую функции операционной системы, то мне не надо думать о таких вещах. Эти функции достаточно сложны и учитывают все эти тонкости.
Используя прерывание №10h я напишу так:
ax = 02h // Номер функции установки курсора в нужную позицию
dh=1 // Вторая строка, номера с 0
dl=9 // 10-я колонка
Int 10h // Вызов функции с заданными параметрами
ax=09h // Номер функции записи символа в текущей позиции
al=97 // Код буквы ‘a’
Int 10h // Вызов функции
Но не все устройства имеют стандартные обработчики в DOS-е, которые позволяют с ними работать. Для работы с мышью, например, использовались программы – драйверы производителей этих мышей. Использовать их конечно тоже не обязательно. Подключенная мышь и без них передаёт и пишет по какому-то адресу свои нули и единицы, показывающие в какую строну и на какое расстояние она переместилась. Но с ними проще. Дело в том, что мышь – простое электро-механическое устройство. Единственное, что может комбинация катающегося по поверхности шарика и проводочков – определить сторону и величину смещения. Мышь не умеет анализировать эту информацию. Этим должен заниматься компьютер. Обычно этим занимался драйвер мыши, который писал свои функции для прерывания №33h. Когда драйвер установлен можно было записать:
ax = 03h // Получить информацию мыши
int 33h // Вызвать функцию
После этого в регистре CX можно было взять X координату мыши, а в регистре DX – Y координату.
Чтобы эта информация была драйвер делает очень много. Он считывает всю информацию, поступающую от мыши и уже по ней (суммируя и вычитая) определяет, положение курсора на экране. Он же, т.е драйвер рисует курсор мыши в нужном месте, не забывая стирать его там, где мышь бала только что. Он же обычно контролирует попытку вывести курсор мыши за пределы экрана и не меняет координаты при такой попытке.
Кроме аппаратного уровня и уровня функций операционной системы – прерываний уже в DOS-е появился третий уровень – пользовательские функции в библиотеках программ.
Вот например:
http://www.codenet.ru/progr/other/mouse.php
void ShowMouseCursor () {
asm {
mov ax, 1 int 33h
}
}
… Помнить все эти номера довольно сложно. Намного проще работать с человеческими названиями, по которым понятно, что делает эта функция. Функция в примере делает курсор мыши видимым. Достаточно написать ShowMouseCursor () и внутри всё само сделается, а на экране появится мышачий курсор.
Следующее устройство, у котором надо написать – принтер. Он интересен хотя бы тем, что не с него читают, а в него записывают. Ничего особо сложного тут нет. Единственное, что обычно требуется – послать вначале какую-то управляющую последовательность, означающую что сейчас начнётся передача информации. Мало ли что может быть? Программный сбой, замыкание проводов. Без точной информации о том, что это именно запись, принтер не начнёт печать.
Примерно так это выглядит для COM порта:
https://www.opennet.ru/docs/RUS/serial_guide/
Логичный вопрос: А что происходит со стороны принтера и что ему попадает? А вот этого я не знаю. Это уже даже не аппаратный уровень а электронный. Но могу предположить, что 0 или 1 в каком-то бите переданной информации это наличие или отсутствие напряжения на каком-то штырьке вилки.
Т.е происходит что-то типа того, что в этой простенькой электрической схеме:
https://drive.google.com/file/d/0B3i2SFYLER0HVTRnalNHMXdEalE/view?usp=sharing
Аналогия с замкнутыми и разомкнутыми ключами отчасти оправдана, ведь буква – это нарисованные точки в одних местах (1) и их отсутствие в других местах (0). Т.е принтер просто берёт очередной байт информации (8 битов, т.е нулей или единиц) и последовательно отрисовывает всё, что ему прислали (замыкая ключи только там, где переданы единицы).
Теперь про WINDOWS. В этой операционной системе уж нет доступа к аппаратным средствам и векторам прерывания. Точнее они конечно есть, но добраться туда намного сложнее чем из DOS-а. Если DOS в качестве функций, которые могут использовать программисты давал им набор тех самых прерываний, то WINDOWS даёт уже набор функций с удобными названиями. Эти функции и есть то, что рекомендуется использовать в WINDOWS.
Вот так, например, выглядит функция, вызвав которую можно получить положение курсора мыши:
https://msdn.microsoft.com/ru-ru
Имя функции MousePosition и хранится она в библиотеке System.Windows.Forms.dll. Конкретно эту библиотеку писали, конечно, авторы WINDOWS. Но и сторонние разработчики могут писать свои программы – драйвера, которые позволяют работать с любыми, подключенными к компьютеру устройствами.
GPS-ом программно никогда не пользовалась. Но видимо с ним работают через эту штуку:
https://msdn.microsoft.com/ru-ru
Т.е если на компьютер как-то с какого-то устройства попадает информация о координатах, то инициализировав объект GeoCoordinateWatcher() можно постоянно получать координаты, вызывая свойство Position.
Следующая информация уже не относиться к компьютерным драйверам: GPS – не единственный инструмент, позволяющий определить координаты. Есть ещё и такое:
https://xakep.ru/2009/05/29/48378/
Но это так, для информации.
|