Морис Бах - Архитектура операционной системы UNIX
- Название:Архитектура операционной системы UNIX
- Автор:
- Жанр:
- Издательство:Издано корпорацией Prentice-Hall.
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Морис Бах - Архитектура операционной системы UNIX краткое содержание
Архитектура операционной системы UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
алгоритм syscall /* алгоритм запуска системной функции */
входная информация: номер системной функции
выходная информация: результат системной функции
{
найти запись в таблице системных функций, соответствующую указанному номеру функции;
определить количество параметров, передаваемых функции;
скопировать параметры из адресного пространства задачи в пространство процесса;
сохранить текущий контекст для аварийного завершения (см. раздел 6.44);
запустить в ядре исполняемый код системной функции;
if (во время выполнения функции произошла ошибка)
{
установить номер ошибки в нулевом регистре сохраненного регистрового контекста задачи;
включить бит переноса в регистре PS сохраненного регистрового контекста задачи;
}
else
занести возвращаемые функцией значения в регистры 0 и 1 в сохраненном регистровом контексте задачи;
}
Рисунок 6.12. Алгоритм обращения к системным функциям
В качестве примера рассмотрим программу, которая создает файл с разрешением чтения и записи в него для всех пользователей (режим доступа 0666) и которая приведена в верхней части Рисунка 6.13. Далее на рисунке изображен отредактированный фрагмент сгенерированного кода программы после компиляции и дисассемблирования (создания по объектному коду эквивалентной программы на языке ассемблера) в системе Motorola 68000. На Рисунке 6.14 изображена конфигурация стека для системной функции создания. Компилятор генерирует программу помещения в стек задачи двух параметров, один из которых содержит установку прав доступа (0666), а другой — переменную «имя файла» [18] Очередность, в которой компилятор вычисляет и помещает в стек параметры функции, зависит от реализации системы.
. Затем из адреса 64 процесс вызывает библиотечную функцию creat (адрес 7a), аналогичную соответствующей системной функции. Адрес точки возврата из функции 6a, этот адрес помещается процессом в стек. Библиотечная функция creat засылает в регистр 0 константу 8 и исполняет команду прерывания (trap), которая переключает процесс из режима задачи в режим ядра и заставляет его обратиться к системной функции. Заметив, что процесс вызывает системную функцию, ядро выбирает из регистра 0 номер функции (8) и определяет таким образом, что вызвана функция creat. Просматривая внутреннюю таблицу, ядро обнаруживает, что системной функции creat необходимы два параметра; восстанавливая регистровый контекст предыдущего уровня, ядро копирует параметры из пользовательского пространства в пространство процесса. Процедуры ядра, которым понадобятся эти параметры, могут найти их в определенных местах адресного пространства процесса. По завершении исполнения кода функции creat управление возвращается программе обработки обращений к операционной системе, которая проверяет, установлено ли поле ошибки в пространстве процесса (то есть имела ли место во время выполнения функции ошибка); если да, программа устанавливает в регистре PS бит переноса, заносит в регистр 0 код ошибки и возвращает управление ядру. Если ошибок не было, в регистры 0 и 1 ядро заносит код завершения. Возвращая управление из программы обработки обращений к операционной системе в режим задачи, библиотечная функция проверяет состояние бита переноса в регистре PS (по адресу 7): если бит установлен, управление передается по адресу 13c, из нулевого регистра выбирается код ошибки и помещается в глобальную переменную errno по адресу 20, в регистр 0 заносится -1, и управление возвращается на следующую после адреса 64 (где производится вызов функции) команду. Код завершения функции имеет значение -1, что указывает на ошибку в выполнении системной функции. Если же бит переноса в регистре PS при переходе из режима ядра в режим задачи имеет нулевое значение, процесс с адреса 7 переходит по адресу 86 и возвращает управление вызвавшей программе (адрес 64); регистр 0 содержит возвращаемое функцией значение.
char name[] = "file";
main()
{
int fd;
fd = creat(name, 0666);
}
Фрагменты ассемблерной программы, сгенерированной в системе Motorola 68000
Адрес Команда
—
# текст главной программы
—
58: mov &0x1b6, (%sp) # поместить код 0666 в стек
5e: mov &0x204, -(%sp) # поместить указатель вершины стека и переменную «имя файла» в стек
64: jsr 0x7a # вызов библиотечной функции создания файла
—
# текст библиотечной функции создания файла
7a: movq &0x8, %d0 # занести значение 8 в регистр 0
7c: trap &0x0 # внутреннее прерывание операционной системы
7e: bcc &0x6 ‹86› # если бит переноса очищен, перейти по адресу 86
80: jmp 0x13c # перейти по адресу 13c
86: rts # возврат из подпрограммы
—
# текст обработки ошибок функции
13c: mov %d0, &0x20e # поместить содержимое регистра 0 в ячейку 20e (переменная errno)
142: movq &-0x1, %d0 # занести в регистр 0 константу -1
144: mova %d0, %a0
146: rts # возврат из подпрограммы
Рисунок 6.13. Системная функция creat и сгенерированная программа ее выполнения в системе Motorola 68000

Рисунок 6.14. Конфигурация стека для системной функции creat
Несколько библиотечных функций могут отображаться на одну точку входа в список системных функций. Каждая точка входа определяет точные синтаксис и семантику обращения к системной функции, однако более удобный интерфейс обеспечивается с помощью библиотек. Существует, например, несколько конструкций системной функции exec, таких как execl и execle, выполняющих одни и те же действия с небольшими отличиями. Библиотечные функции, соответствующие этим конструкциям, при обработке параметров реализуют заявленные свойства, но в конечном итоге, отображаются на одну и ту же функцию ядра.
6.4.3 Переключение контекста
Если обратиться к диаграмме состояний процесса (Рисунок 6.1), можно увидеть, что ядро разрешает производить переключение контекста в четырех случаях: когда процесс приостанавливает свое выполнение, когда он завершается, когда он возвращается после вызова системной функции в режим задачи, но не является наиболее подходящим для запуска, или когда он возвращается в режим задачи после завершения ядром обработки прерывания, но так же не является наиболее подходящим для запуска. Как уже было показано в главе 2, ядро поддерживает целостность и согласованность своих внутренних структур данных, запрещая произвольно переключать контекст. Прежде чем переключать контекст, ядро должно удостовериться в согласованности своих структур данных: то есть в том, что сделаны все необходимые корректировки, все очереди выстроены надлежащим образом, установлены соответствующие блокировки, позволяющие избежать вмешательства со стороны других процессов, что нет излишних блокировок и т. д. Например, если ядро выделяет буфер, считывает блок из файла и приостанавливает выполнение до завершения передачи данных с диска, оно оставляет буфер заблокированным, чтобы другие процессы не смогли обратиться к буферу. Но если процесс исполняет системную функцию link, ядро снимает блокировку с первого индекса перед тем, как снять ее со второго индекса, и тем самым предотвращает возникновение тупиковых ситуаций (взаимной блокировки).
Читать дальшеИнтервал:
Закладка: