Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Интерфейс между операционной системой и программами пользователя определяется набором системных вызовов, предоставляемой системой. У большинства современных операционных систем есть системные вызовы, выполняющие одни и те же функции, хотя их реализация может быть различна. Фактический механизм обращения к системным функциям является в высокой степени машинно-зависимым и часто должен реализовываться на ассемблере, но существуют библиотеки процедур, делающие возможным обращение к системным процедурам из программ на С и других языках программирования.
Любой компьютер с одни процессором в каждый момент времени может выполнять только одну команду. Если процесс выполняет программу пользователя в пользовательском режиме и нуждается в системной службе, например, чтение данных из файла, он должен выполнить прерывание или команду системного вызова для передачи управления операционной системе. Затем операционная система по параметрам вызова определяет, что требуется вызывающему процессу. После этого она обрабатывает системный вызов и возвращает управление команде, следующей за системным вызовом.
Рассмотрим системный вызов read.У этого вызова есть три параметра: 1) задание файла; 2) указание буфера; 3) количество байтов, которое необходимо прочитать. Как практически все системные вызовы, он запускается из программы на С с помощью вызова библиотечной процедуры с тем же именем, что и системный вызов. Вызов из программы на С может выглядеть следующим образом: count=read(fd, &buffer, nbytes);
Системный вызов возвращает количество действительно прочитанных байтов в переменную count. Обычно эта величина совпадает с параметром nbytes, но может быть меньше, если в процессе чтения процедуре встретился конец файла. Если системный вызов не может быть выполнен или из-за неправильных параметров или из-за дисковой ошибки, значение счетчика count устанавливается равным минус один, а номер ошибки помещается в глобальную переменную errno. Программы всегда должны проверять результат системного вызова, чтобы отслеживать появление ошибок.
Системные вызовы выполняются за серию шагов: 1) передача nbytes в стек; 2) передача &buffer в стек; 3) передача fd в стек; 4) вызов библиотечной процедуры; 5) передача кода для чтения в регистр; 6) переключение из пользовательского режима в режим ядра; 7) запускается программа ядра проверяет номер системного вызова и затем отправляет его нужному обработчику, используя таблицу указателей на обработчик системных вызовов, индексированную по номерам вызовов; 8) в этом месте начинает функционировать обработчик системных вызовов; 9) как только он завершает свою работу, управление может возвращается в пространство пользователя к библиотечной процедуре, к команде, следующей за командой TRAP; 10) Эта процедура в свою очередь передает управление программе пользователя обычным способом, которым производится возврат из вызванной процедуры; 11) Чтобы закончить работу, программа пользователя должна очистить стек, как это делается и после каждого вызова процедуры. Учитывая, что стек растет вниз, последняя команда увеличивает указатель стека ровно на столько, насколько нужно для удаления параметров, помещенных в стек перед запросом read. Теперь программа может продолжать свою работу.
Дата публикования: 2015-01-26; Прочитано: 440 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!