Книга: Основы программирования в Linux
Системные вызовы и драйверы устройств
Системные вызовы и драйверы устройств
Вы можете обращаться к файлам и устройствам и управлять ими, применяя небольшой набор функций. Эти функции, известные как системные вызовы, непосредственно представляются системой UNIX (и Linux) и служат интерфейсом самой операционной системы.
В сердце операционной системы, ее ядре, есть ряд драйверов устройств. Они представляют собой коллекцию низкоуровневых интерфейсов для управления оборудованием системы. Например, в ней есть драйвер устройства для ленточного накопителя, который знает, как запустить ленту, перемотать ее вперед и назад, прочитать ее и записать на нее и т.д. Ему известно, что на ленту следует писать данные блоками определенного размера. Поскольку ленты — по природе своей устройства с последовательным доступом, драйвер не может обращаться непосредственно к блокам ленты, сначала он должен перемотать ленту до нужного места. Точно так же низкоуровневый драйвер накопителя жесткого диска будет записывать на диск в каждый момент времени только целое число дисковых секторов, но сможет прямо обратиться к любому нужному блоку диска, поскольку диск — это устройство с произвольным доступом.
Для формирования одинакового интерфейса драйверы устройств включают в себя все аппаратно-зависимые свойства. Уникальные аппаратные средства обычно доступны через системный вызов ioctl
(I/O control, управление вводом/выводом).
Файлы устройств из каталога /dev используются одинаково: они могут открываться, читаться, на них можно записывать и их можно закрывать. Например, один и тот вызов open
, используемый для доступа к обычному файлу, применяется для обращения к пользовательскому терминалу, принтеру или ленточному накопителю.
К низкоуровневым функциям или системным вызовам, используемым для обращения к драйверам устройств, относятся следующие:
? open
— открывает файл или устройство;
? read
— читает из открытого файла или устройства;
? write
— пишет в файл или устройство;
? close
— закрывает файл или устройство;
? ioctl
— передает управляющую информацию драйверу устройства.
Системный вызов ioctl
применяется для аппаратно-зависимого управления (как альтернатива стандартного ввода/вывода), поэтому он у каждого устройства свой. Например, вызов ioctl
может применяться для перемотки ленты в ленточном накопителе или установки характеристик управления потоками последовательного порта. Этим объясняется необязательная переносимость ioctl
с машины на машину. Кроме того, у каждого драйвера определен собственный набор команд ioctl
.
Этот системный вызов, как и другие, обычно описывается в разделе 2 интерактивного справочного руководства. Прототипы функций со списком параметров и типом возвращаемого функцией значения, используемые в системных вызовах, а также связанные с ними директивы #define
с определением констант представлены в файлах include
. Нужные для каждого системного вызова дополнения будут подключаться с описаниями отдельных вызовов.
- Устройство ввода-вывода
- 10.4.4. Системные вызовы, допускающие повторный запуск
- Файлы символьных устройств
- Системные службы
- Глава 8 Специализированные интерфейсы периферийных устройств
- 10.1.2 Системные функции и взаимодействие с драйверами
- Глава 11 Установка новых устройств. Драйверы
- Глава 7. Системные трюки
- Системные переменные ROWS_AFFECTED, GDSCODE, SQLCODE, TRANSACTIONJD, CONNECTIONJD
- 1.3. Правила подключения к компьютеру внешних устройств
- Диспетчер устройств
- 1.4 Структуры данных, связанные с драйверами устройств Windows