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