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