Реализация драйвера часов в MINIX 3
Драйвер часов осуществляет доступ к ряду других глобальных переменных.
Он использует переменную 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 считывает и возвращает текущее значение регистра счетчика микросхемы часов.
Еще по теме Реализация драйвера часов в MINIX 3:
- Драйвер Счастья в Работе:
- ЧАСОВАЯ АСТРОЛОГИЯ.
- Семь часов
- "Часовое" и "целевое" время
- Сколько часов сна полезны человеку
- ..Бой часов Вестминстерского аббатства...
- Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание, 2007
- На свете почти не существует таких срочных дел, которые было бы нельзя отложить на несколько часов.
- Глава 6. Реализация права
- 4.2. Реализация
- 4. Реализация прав по ипотеке
- 3.3. Дальнейшая реализация проекта
- РЕАЛИЗАЦИЯ МЫСЛЕННОГО ПРЕДСТАВЛЕНИЯ
- 10. Реализация заложенного имущества
- Механизм реализации личности
- Статья 591. Реализация предмета залога
- Практическая реализация.
- Практическая реализация.