Разработка ядра Linux
Шрифт:
В конец файла добавляется следующая строка.
В конце концов необходимо реализовать сам системный вызов
Это все! Загрузите новое ядро. Теперь из пространства пользователя можно вызвать системную функцию
Доступ к системным вызовам из пространства пользователя
В большинстве случаев системные вызовы поддерживаются библиотекой функций языка С. Пользовательские приложения могут получать прототипы функций из стандартных заголовочных файлов и компоновать программы с библиотекой С для использования вашего системного вызова (или библиотечной функции, которая вызывает ваш системный вызов). Однако если вы только что написали системный вызов, то маловероятно, что библиотека
К счастью, ОС Linux предоставляет набор макросов-оболочек для доступа к системным вызовам. Они позволяют установить содержимое регистров и выполнить машинную инструкцию
Макрос для вызова этой системной функции будет выглядеть так.
После этого приложение может просто вызывать функцию
Каждый макрос принимает
Напишем макрос, который позволяет вызвать нашу замечательную системную функцию, и соответствующий
Почему не нужно создавать системные вызовы
Новый системный вызов легко реализовать, тем не менее это необходимо делать только тогда, когда ничего другого не остается. Часто, для того чтобы обеспечить новый системный вызов, существуют более подходящие варианты. Давайте рассмотрим некоторые "за" и "против" и возможные варианты.
Для создания нового интерфейса в виде системного вызова могут быть следующие "за".
• Системные вызовы просто реализовать и легко использовать.
• Производительность системных вызовов в операционной системе Linux очень высока.
Возможные "против".
• Необходимо получить номер системного вызова, который должен быть официально назначен в период работы над разрабатываемыми сериями ядер.
• После того как системный вызов включен в стабильную серию ядра, он становится "высеченным в камне". Интерфейс не должен меняться, чтобы не нарушить совместимости с прикладными пользовательскими программами.
• Для каждой аппаратной платформы необходимо регистрировать отдельный системный вызов и осуществлять его поддержку.
• Для простого обмена информацией системный вызов — это "стрельба из пушки по воробьям".
Возможные варианты.
• Реализовать файл устройства и использовать функции
• Некоторые интерфейсы, например семафоры, могут быть представлены через дескрипторы файлов. Управлять этими устройствами также можно по аналогии с файлами.
• Добавить информационный файл в соответствующем месте файловой системы
Для большого числа интерфейсов, системные вызовы — это правильный выбор. В операционной системе Linux пытаются избегать простого добавления системного вызова для поддержки каждой новой, вдруг появляющейся абстракции. В результате получился удивительно четкий уровень системных вызовов, который принес очень мало разочарований и привел к малому числу не рекомендованных к использованию и устаревших (deprecated) интерфейсов (т.е. таких, которые больше не используются или не поддерживаются).
Малая частота добавления новых системных вызовов свидетельствует о том, что Linux — это стабильная операционная система с полным набором функций. Очень немного системных вызовов было добавлено во время разработки серий ядер 2.3 и 2.5. Большая часть из новых системных вызовов предназначена для улучшения производительности.
В заключение о системных вызовах
В этой главе было рассмотрено, что такое системные вызовы и как они соотносятся с вызовами библиотечных функций и интерфейсом прикладных программ (API). После этого было описано, как системные вызовы реализованы в ядре Linux, а также была представлена последовательность событий для выполнения системного вызова: программное прерывание ядра, передача номера системного вызова и аргументов системного вызова, выполнение соответствующей функции системного вызова и возврат результатов работы в пространство пользователя.