Главная страница Межпроцессное взаимодействие (состязание) необходимо скопировать, и все данные передаются phys copy. Это подобно тому, как дисковые устройства могут выполнять несколько передач данных по одному запросу. С][ользователь~ 7~1Г Сздача систеГ) (дача диска ([Прерыва ние~ С[пользователь~ СЗача системьГ) (Задача диска (Ппрерывание Рис. 3.29. а - в худшем случае для считывания блока требуется семь сообщений; б - в лучшем случае требуются четыре сообщения Системная задача принимает еще несколько типов сообщений, которые большей частью довольно понятны. Два из них используются только при запуске системы. Файловая система, чтобы запросить параметры загрузки, передает сообщение SYS GBOOT. В файле include/mi nix/boot, h есть структура, bparam s, при помощи которой монитор начальной загрузки может передать различные параметры ядру системы. Выполняет эту операцию функция do gboot, которая просто копирует данные из одной части памяти в другую. Кроме того, менеджер памяти при загрузке посылает системной задаче серии сообщений SYS MEM, чтобы определить базовые адреса и длины доступных блоков памяти. Этот запрос обслуживает do mem. Сообщение SYS UMAP используется процессами, не входящими в ядро, с целью вычислить физический адрес по заданному виртуальному. Расчет выполняет функция do umap, вызывающая umap - функцию, используемую для этой цели в ядре. Представитель последнего типа сообщений, на котором мы остановимся, - это SYS TRACE. Оно обеспечивает работу системного вызова ptrace, применяемого для отладки. Отладка не является фундаментальной функцией операционной системы, но поддержка со стороны ОС идет ей только на пользу. Благодаря one- рационной системе отладчик может считывать и изменять память, принадлежащую отлаживаемому контексту, а также и регистры процессора, хранящиеся в таблице процессов, когда программа не работает. Обычно процесс выполняется до тех пор, пока не заблокируется на операции ввода/вывода или не истечет его квант времени. Но большинство процессоров позволяют ограничить работу процесса выполнением единственной инструкции или сделать так, чтобы процесс выполнялся до тех пор, пока не будет достигнута определенная инструкция (для этого задается точка останова, breakpoint). При помощи подобных средств значительно упрощается детальный анализ профамм. Вызов ptrace помогает реализовать одиннадцать операций. Некоторые из них целиком перекладываются на менеджер памяти, но для большинства менеджер памяти посылает системной задаче сообщение SYS TRACE, а та уже вызывает функцию do trace. Внутри нее в операторе switch в зависимости от типа операции выполняется нужный код. Сами операции, в общем, просты. В MINIX бит P ST0P в таблице процессов означает, что процесс отлаживается, этот бит устанавливается отладчиком при необходимости остановить процесс (команда T ST0P) и сбрасывается, чтобы вновь позволить ему выполняться (команда T RESUME). Отладка опирается на встроенную поддержку со стороны процессора, в процессорах Intel она контролируется одним из битов регистра признаков. Когда этот бит установлен, процессор, выполнив одну инструкцию, генерирует исключение SIGTRAP. Как ранее уже упоминалось, менеджер памяти останавливает отлаживаемую программу, если она получила сигнал. Значение бита TRACEBIT изменяется командами T STOP и T STEP. Контрольные точки могут устанавливаться двумя способами: либо при помощи команды T SETINS, которая заменяет инструкцию специальным кодом, что приводит к генерации SIGTRAP, либо с помощью команды T SETUSER изменить значение специального регистра точки останова. В любой системе, на которую переносима MINIX, вероятнее всего, отладчик можно будет реализовать при помощи подобных методик, но перенос этих функций потребует изучения конкретного аппаратного обеспечения. Большинство выполняемых do trace команд возвращают или модифицируют данные либо из адресного пространства отлаживаемого процесса, либо из его записи в таблице процессов. Разрешать менять значения некоторых регистров и флагов процессора слишком опасно, поэтому, чтобы предотвратить опасные действия, в команде T SETUSER делается множество проверок. В конце файла system.с находятся несколько вспомогательных функций, используемых в различных местах кода по всему ядру. Когда задаче необходимо вызвать сигнал (например, задача часов вызывает SIGALARM, а задача терминала - SIGINT), она обращается к функции cause sig. Эта подпрограмма устанавливает бит в поле p pending записи процесса в таблице процессов, после чего проверяет, ждет ли менеджер памяти сообщений от ANY (то есть находится в бездействии и ожидает следующего запроса). Если менеджер памяти отлеживается, она вызывает inform, чтобы он обработал сигнал. Функция inform, как было описано выше, вызывается после проверки активности менеджера памяти. В дополнение к cause sig, она вызывается из mini rec (файл ргос.с), когда менеджер памяти блокируется и остались текущие сигналы ядра. Функция inform создает сообщение типа KSIG и отправляет его менеджеру памяти. После того как сообщение будет скопировано в приемный буфер менеджера памяти, вызвавший cause sig процесс или задача продолжит свое выполнение. При этом процесс не ждет, когда получит управление менеджер памяти, как было бы в варианте обычного механизма обмена сообщениями, когда отправитель сообщения блокируется. Тем не менее, перед тем как завершить работу, cause sig вызывает функцию lock pick proc, которая планирует менеджер памяти на запуск. Так как приоритет задач больше, чем у серверов, менеджер памяти не будет запущен до тех пор, пока не отработают все задачи. Планировщик получает управление, когда завершается вызвавшая сигнал задача. Если менеджер памяти окажется самым приоритетным среди готовых к запуску процессов, он будет запущен на выполнение. Широко используемая подпрограмма umap преобразует виртуальные адреса в физические. Как уже упоминалось, она вызывается из do umap, которая обслуживает сообщение SYS UMAP. Аргументами являются указатель на запись в таблице процессов, принадлежащую тому процессу, виртуальный адрес которого преобразуется, флаг, обозначающий, какому из сегментов (код, данные или стек) принадлежит адрес, сам виртуальный адрес и количество байтов. Количество байтов принимается во внимание umap тогда, когда нужно проверить, укладывается ли буфер заданного размера, начинающийся с указанного виртуального адреса, в адресном пространстве процесса. В самом преобразовании адреса размер буфера не участвует. Функция umap используется всеми задачами, копирующими данные из адресного пространства пользовательских процессов или в него. Для драйверов устройств было бы удобно обращаться к umap, задавая процесс не указателем на запись в таблице процессов, а по номеру процесса. Есть такая функция - это numap. Чтобы преобразовать номер процесса в указатель, она вызывает proc addr, а затем делает вызов umap. Последняя в system.c - функция aLloc segments. Она вызывается из do newmap, а также из процедуры ядра main при его инициализации. Код этой функции существенно зависит от аппаратного обеспечения. Она берет описания сегментов из записи в таблице процессов и манипулирует с регистрами и дескрипторами процессоров Pentium, ответственными за аппаратную защиту памяти. Резюме Вводом/выводом часто пренебрегают, хотя он заслуживает более серьезного отношения. Значительная доля любой операционной системы связана с вводом/ выводом. Мы начали с рассмотрения аппаратного обеспечения ввода/вывода и связи устройств ввода/вывода с контроллерами. Затем мы рассмотрели четыре уровня программного обеспечения ввода/вывода: обработчики прерываний, драйверы устройств, независимое от устройств программное обеспечение и библиотеки плюс спулеры, работающие в пространстве пользователя. Далее мы изучили проблему взаимной блокировки и инструментарий борьбы с ней. Взаимная блокировка возникает, когда имеется группа процессов, полу-
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |