Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Службы ядра Прерывания от устройств ввода/вывода

Прерывания от устройств ввода/вывода

Прерывания от устройств ввода/вывода и других устройств обрабатываются процедурами прерываний, которые загружаются в виде части адресного пространства ядра. Эти процедуры обрабатывают интерфейс терминала консоли, одни или несколько часов и несколько программно инициируемых прерываний, используемых системой для обработки часов с низким приоритетом и для сетевых возможностей .

В отличие от исключений и системных вызовов прерывания от устройств происходят асинхронно. Процесс, запросивший обслуживание, скорее всего не будет текущим и может даже больше не существовать. Процесс, начавший операцию, будет уведомлен, что операция завершилась, когда он будет вновь запущен. Как и в случае с исключениями и системными вызовами, должно быть сохранено все состояние машины, поскольку любые изменения могли бы вызвать ошибки в текущем выполняющемся процессе.

Обработчики прерываний устройств запускаются лишь по требованию. В отличие от более ранних версий FreeBSD ядро FreeBSD 5.2 создает контекст для каждого драйвера устройства. Таким образом, точно так же как один процесс не может получить доступ к контексту ранее работавшего процесса, обработчики прерываний не могут получить доступ к какому-либо из контекстов ранее выполнявшихся обработчиков прерываний. Стек, обычно использующийся ядром, является частью контекста процесса. Поскольку у каждого устройства есть свой собственный контекст, у него есть также свой стек, с которым он работает.

Прерывания в ранних системах FreeBSD не имели контекста, поэтому они должны были выполняться до своего завершения, не входя в состояние сна. В FreeBSD 5.2 прерывания могут блокироваться в ожидании ресурсов. Однако в блокированном состоянии они не могут вызваться другим событием, поэтому для снижения вероятности потерь прерываний большинство обработчиков по-прежнему работают до своего завершения без ожиданий.

Обработчик прерываний никогда не извлекается из верхней половины ядра. Таким образом, он должен получить всю информацию, которая ему нужна, из структур данных, которые он разделяет с верхней половиной ядра - обычно своей глобальной рабочей очереди. Аналогично вся информация, предоставленная верхней половине ядра обработчиком прерывания, должна передаваться таким же способом.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 26 гостей онлайн