2017-02-15 27 views
0

Я играл с ioctl, и этот вопрос возник.Почему количество системных вызовов очень ограничено?

фон

  1. мне сказали, что основной мотив для системных вызовов является то, что количество обработчиков прерываний разрешено очень ограничено. Так много OS реализуют абстракцию системных вызовов (ловушки a.k.a.), которые занимают только один номер прерывания (0x80 в случае Linux), но принимают дополнительные аргументы для предоставления различных функций по требованию.
  2. this thread предлагает количество системных вызовов на самом деле очень ограниченное, поэтому те же рассуждения, приведенные выше, применяются снова для изобретения ioctl.

Отсюда мой вопрос. Почему ОС не предлагает достаточно системных вызовов и избавляется от ioctl? (Или просто создать иерархическую структуру, обеспечивающую лучшую масштабируемость?)

ответ

1

Мое мнение об этом заключается в том, что системные вызовы можно рассматривать как набор услуг, предоставляемых ядром операционной системы, для пользовательских приложений, тогда как ioctl только одна из этих служб, которая позволяет отправлять пользовательскую команду на конкретное устройство (или драйвер).

При разработке драйвера вы можете написать обработчик для запроса ioctl. Управление же путем реализации собственных системных вызовов имеет ряд недостатков:

  • ваша реализация специфична для драйвера, другие компоненты, вероятно, не будет использовать его,
  • добавления новых системных вызовов не так просто - на WIndows , это практически невозможно из-за Patchguard (Kernel Patch Protection),
  • В Windows ядро ​​может помочь вам с «проверкой» буферов ввода-вывода для запроса IOCTL, вы должны выполнить всю работу самостоятельно, собственные системные вызовы.

Вы можете просмотреть ioctl как обобщение для read и write. Оба входных и выходных буфера могут быть предоставлены вместе с управляющим кодом, определяющим действие, требуемое от цели (обычно это драйвер ядра).

+0

Я думаю, что ваш ответ имеет больше смысла, чем вышеупомянутый пост. Просто для подтверждения, системные вызовы похожи на настраиваемый обработчик для взаимодействия ОС с процессором, а 'ioctl' в ОС - настраиваемый обработчик для взаимодействия между приложениями пользовательского пространства и ядром? – wlnirvana

+0

Обработчики системных вызовов определяются ядром ОС как механизм связи между usermode и kernelmode (CPU может помочь, предоставляя специальные инструкции, облегчающие и ускоряющие переключение между пользователем и режимом ядра). Они более или менее жестко привязаны к ядру ОС (например, как фиксированный массив подпрограмм, реализующих отдельные системные вызовы). Запросы, созданные от имени «ioctl» и нескольких других системных вызовов, обычно отправляются драйверу, ответственному за цель ioctl, поэтому «ioctl» может (в некоторой степени) настраиваться разработчиком (документированным образом). –