<<
>>

Реализация драйвера часов в MINIX 3

Таймерное задание не использует основные структуры данных; для работы со временем предназначены несколько переменных. Переменная realtime (строка 10462) является главной — она считает такты часов.
Глобальная переменная lost_ticks определена в файле glo.h (строка 5333). Она предназначена для использования всеми функциями, выполняемыми в пространстве ядра и способными запретить прерывания, которые достаточно длинны для того, чтобы один или более тиков оказались потерянными. В настоящее время переменную lost_ ticks использует функция int86, расположенная в файле klib386 . s. Функция int 8 6 задействует монитор загрузки для передачи управления в BIOS, и перед возвращением в ядро монитор возвращает в регистре есх число тиков, затраченных на обслуживание вызова BIOS. Хотя микросхема таймера не приводит к выполнению обработчика прерывания при обслуживании запроса BIOS, монитор загрузки может поддерживать время с помощью BIOS.

Драйвер часов осуществляет доступ к ряду других глобальных переменных.

Он использует переменную proc_ptr — указатель на запись таблицы процессов, соответствующую текущему процессу, prev_ptr — указатель на предыдущий процесс и bill_ptr — указатель на процесс, которому начисляется процессорное время. С помощью этих переменных драйвер часов оперирует различными полями записей, в частности p_user_time и p_sys_time, для учета и для уменьшения оставшегося времени кванта соответственно.

При запуске MINIX 3 выполняется вызов всех драйверов. Большинство из них совершают действия по инициализации, пытаются получить сообщение и блокируются. Драйвер часов, clock_task (строка 10648), не является исключением. Сначала он обращается к функции init_clock, чтобы установить частоту часов равной 60 Гц. После получения сообщения драйвер вызывает функцию do_clockticks при условии, что типом сообщения является HARD__INT (строка 10486).

Все остальные сообщения считаются ошибками.

Функция do_clockticks (строка 10497), противореча собственному названию, не вызывается в каждом такте часов. Она вызывается в случае, если обработчик прерывания определил наличие важной работы. Одно из условий запуска do_c lockt icks — окончание кванта текущего процесса. Если процесс может быть вытеснен (системное и таймерное задания не входят в их число), вызывается функция lock_dequeue, а затем — функция lock_enqueue (строки 10510-10512). В результате процесс удаляется из очереди, снова переводится в состояние готовности и перепланируется. Еще одна причина запуска do_ clockticks — истечение сторожевого таймера. Таймеры и их связанные списки используются в MINIX 3 столь интенсивно, что для их поддержки создана целая библиотека функций. Библиотечная функция tmrs_exptimers, вызываемая в строке 10517, запускает сторожевые функции для всех истекших таймеров и деактивирует их.

Функция init_clock (строка 10529) вызывается только один раз — при вызове таймерного задания. В коде можно найти несколько мест и сказать: «выполнение MINIX 3 начинается отсюда!» Это — одно из них; часы являются обязательным компонентом любой системы с вытесняющей многозадачностью. Функция init_clock сначала записывает 3 байта в микросхему часов, задавая ее режим и нужное значение счетчика в главном регистре, а затем регистрирует свой номер процесса, номер прерывания и адрес обработчика для надлежащего обслуживания. Наконец, функция разрешает контроллеру прерываний принимать прерывания от таймера.

Следующая функция, clock_stop, отменяет результаты инициализации микросхемы часов. Она объявлена открытой (public) и не вызывается из файла clock, с. Она помещена сюда из-за очевидного сходства с init_clock. Единственный ее вызов выполняется системным заданием при завершении работы MINIX 3 для передачи управления монитору загрузки.

Одновременно с запуском функции init_clock (а точнее, через 16,67 мс) происходит первое прерывание от таймера, и далее прерывания генерируются с частотой 60 раз в секунду до тех пор, пока работает MINIX 3.

Вероятно, код функции clock_handler (строка 10556) выполняется чаще, чем любой другой в MINIX 3. По этой причине разработчики сделали так, чтобы он завершался как можно быстрее. Единственная ситуация, в которой необходим вызов подпрограмм, — использование устаревшего компьютера IBM PS/2 (строка 10586). Обновление текущего времени (в тактах часов) выполняется в строках 10589-10591. После этого обновлению подлежат учетное время и время пользователя.

Внутри обработчика принимается несколько не вполне очевидных решений. В строке 10610 выполняются две проверки, и если хотя бы одна из них оказывается успешной, таймерному заданию посылается уведомление. Функция do_ clocktick, вызываемая таймерным заданием, повторяет проверки с целью определения необходимых действий. Этот шаг нужен потому, что уведомление не способно нести информацию о различных условиях. Рассмотреть и оценить альтернативы мы предлагаем читателю самостоятельно.

Оставшаяся часть файла clock, с содержит уже упомянутые функции. Функция get_uptime (строка 10620) возвращает значение realtime, видимое только функциями файла clock, с. Функции set_timer и reset_timer используют другие функции библиотеки, ответственные за детали манипуляции с цепочкой таймеров. Наконец, функция read_clock считывает и возвращает текущее значение регистра счетчика микросхемы часов.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Реализация драйвера часов в MINIX 3:

  1. Драйвер Счастья в Работе:
  2. ЧАСОВАЯ АСТРОЛОГИЯ.
  3. Семь часов
  4. "Часовое" и "целевое" время
  5. Сколько часов сна полезны человеку
  6. ..Бой часов Вестминстерского аббатства...
  7. Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание, 2007
  8. На свете почти не существует таких срочных дел, которые было бы нельзя отложить на несколько часов.
  9. Глава 6. Реализация права
  10. 4.2. Реализация
  11. 4. Реализация прав по ипотеке
  12. 3.3. Дальнейшая реализация проекта
  13. РЕАЛИЗАЦИЯ МЫСЛЕННОГО ПРЕДСТАВЛЕНИЯ
  14. 10. Реализация заложенного имущества
  15. Механизм реализации личности
  16. Статья 591. Реализация предмета залога
  17. Практическая реализация.
  18. Практическая реализация.