Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Системные вызовы и функции стандартных библиотек

ИНТЕРФЕЙС С ФАЙЛОВОЙ СИСТЕМОЙ

 

Все версии UNIX предоставляют строго определенный ограниченный набор входов в ядро ОС, через который прикладные программы имеют возможность воспользоваться базовыми услугами операционной системы. Эти точки входа получили название системных вызовов (system calls). Системный вызов определяет функцию, выполняемую ядром операционной системы от имени процесса, выполнившего вызов и является интерфейсом самого низкого уровня взаимодействия прикладных процессов с ядром. (в нашей версии Linux их 164, просмотреть их можно с помощью команды man syscalls).

Системные вызовы обычно документированы во втором разделе справочной системы man. В среде программирования Си они определяются как функции, независимо от того, что они, по сути, являются обращением к ядру ОС. В UNIX используется подход, при котором каждый системный вызов имеет соответствующую функцию (или функции) с тем же именем, хранящуюся в стандартной библиотеке языка Си. Эти функции выполняют необходимые преобразования аргументов и вызывают процедуру ядра, используя различные приемы. Библиотечный код, по сути, играет роль оболочки (обертки), в то время как фактические инструкции расположены в ядре операционной системы.

Помимо системных вызовов программисту предлагается большой набор функций общего назначения. Многие из этих функций в процессе выполнения обращаются к системным вызовам, но некоторые вообще не прибегают к услугам ОС. Примеры:

printf(3) использует системный вызов write(2)

strcpy(3) не использует

atoi (3) не использует

 

Функции, о которых идет речь, хранятся в стандартных библиотеках Си и наряду с системными вызовами составляют основу среды программирования в UNIX. Библиотека стандартных функций языка Си (стандарт 1990 г) включает следующие разделы:

- Функции ввода/вывода

- Функции обработки строк и символов

- Математические функции

- Функции ввода/вывода времени и даты

- Функции динамического распределения памяти

- Вспомогательные (служебные) функции

 

Все компиляторы поддерживают больше функций, чем определено стандартом языка. Дополнительные функции предназначены для обеспечения взаимодействия между программами и ОС, для реализации машинно-зависимых операций. Описание таких функций следует искать в технической документации компилятора (у нас компилятор gcc и его библиотека GLIBC)

Библиотечные функции являются «надстройкой» над системными вызовами и обеспечивают более удобный способ получения системных услуг. Например, системный вызов time(2) возвращает время в секундах с момента Epoch: 1 января 1970 года. А функции ctime(3), localtime(3) и т.п. преобразуют это значение в вид, удобный для человеческого восприятия (дата, время с учетом временной зоны и т.п.). К таким функциям можно отнести и функции ввода/вывода, распределения памяти, часть функций управления процессами и т.д.

Системные вызовы (2) и библиотечные функции (3) также различаются по способу передачи процессу информации об ошибке, произошедшей во время системного вызова или функции библиотеки. Системные вызовы в случае ошибки (невозможности своего выполнения) обычно возвращают –1 и устанавливают значение системной переменной errno, указывающее причину возникновения ошибки. Так, например, существует более десятка причин, по которым функция open(2) не сможет открыть файл. Файл заголовков <errno.h> содержит коды ошибок, значения которых может принимать переменная errno, с краткими комментариями.

 

Следует учесть, что переменная errno не обнуляется следующим нормально завершившимся системным вызовом, т.о. она имеет смысл только после системного вызова, завершившегося с ошибкой.

 

Библиотечные функции, как правило, не устанавливают значение errno, а возвращают код ошибки (типа int), который по смыслуразличен для разных функций. Для уточнения возвращаемого значения библиотечной функции следует обращаться к справочной системе man.

 

"СИСТЕМНЫЕ ВЫЗОВЫ". Что же это такое? С точки зрения Си-программиста - это обычные функции. В них передают аргументы, они возвращают значения. Внешне они ничем не отличаются от написанных нами или библиотечных функций и вызываются из программ одинаковым с ними способом.

С точки же зрения реализации - есть глубокое различие. Тело функции-сисвызова расположено не в нашей программе, а в резидентной (т.е. постоянно находящейся в памяти компьютера) управляющей программе, называемой ядром операционной системы.

Поведение всех программ в системе вытекает из поведения системных вызовов, которыми они пользуются. Даже то, что UNIX является многозадачной системой, непосредственно вытекает из наличия системных вызовов fork, exec, wait и спецификации их функционирования! То же можно сказать про язык Си - мобильность программы зависит в основном от набора используемых в ней библиотечных функций (и, в меньшей степени, от диалекта самого языка, который должен удовлетворять стандарту на язык Си). Если две разные системы предоставляют все эти функции (которые могут быть по-разному реализованы, но должны делать одно и то же), то программа будет компилироваться и работать в обеих системах, более того, работать в них одинаково.

Сам термин "системный вызов" как раз означает "вызов системы для выполнения действия", т.е. вызов функции в ядре системы. Ядро работает в привелегированном режиме, в котором имеет доступ к некоторым системным таблицам*, регистрам и портам внешних устройств и диспетчера памяти, к которым обычным программам доступ аппаратно запрещен (в отличие от MS DOS, где все таблицы ядра доступны пользовательским программам, что создает раздолье для вирусов). Системный вызов происходит в 2 этапа: сначала в пользовательской программе вызывается библиотечная функция-"корешок", тело которой написано на ассемблере и содержит команду генерации программного прерывания. Это - главное отличие от нормальных Си-функций - вызов по прерыванию. Вторым этапом является реакция ядра на прерывание:

1. переход в привилегированный режим;

2. разбирательство, КТО обратился к ядру, и подключение u-area этого процесса к адресному пространству ядра (context switching);

3. извлечение аргументов из памяти запросившего процесса;

4. выяснение, ЧТО же хотят от ядра (один из аргументов, невидимый нам - это номер системного вызова);

5. проверка корректности остальных аргументов;

6. проверка прав процесса на допустимость выполнения такого запроса;

7. вызов тела требуемого системного вызова - это обычная Си-функция в ядре;

8. возврат ответа в память процесса;

9. выключение привилегированного режима;

10. возврат из прерывания.

Во время системного вызова (шаг 7) процесс может "заснуть", дожидаясь некоторого события (например, нажатия кнопки на клавиатуре). В это время ядро передаст управление другому процессу. Когда наш процесс будет "разбужен" (событие произошло) - он продолжит выполнение шагов системного вызова.

 

<== предыдущая лекция | следующая лекция ==>
При переломі плеча фіксують плечовий і ліктьовий суглоб (мал. №2, №3) | Основные системные вызовы файловой системы
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 3165; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.