Окончательные шаги регистрации системного вызова

Окончательные шаги регистрации системного вызова

После того как системный вызов написан, процедура его регистрации в качестве официального системного вызова тривиальна и состоит в следующем.

• Добавляется запись в конец таблицы системных вызовов. Это необходимо сделать для всех аппаратных платформ, которые поддерживают этот системный вызов (для большинства системных вызовов — это все возможные платформы). Положение системного вызова в таблице — это номер системного вызова, начиная с нуля. Например, десятая запись таблицы соответствует системному вызову с номером девять.

• Для всех поддерживаемых аппаратных платформ номер системной функции должен быть определен в файле include/linux/unistd.h.

• Системный вызов должен быть вкомпилирован в образ ядра (в противоположность компиляции в качестве загружаемого модуля[30]). Это просто соответствует размещению кода в каком-нибудь важном файле каталога kernel/.

Давайте более детально рассмотрим эти шаги на примере функции системного вызова, foo(). Вначале функция sys_fоо() должна быть добавлена в таблицу системных вызовов. Для большинства аппаратных платформ таблица системных вызовов размещается в файле entry.S и выглядит примерно следующим образом.

ENTRY (sys_call_table)

 .long sys_restart_syscall / * 0 * /

 .long sys_exit

 .long sys_fork

 .long sys_read

 .long sys_write

 .long sys_open /* 5 */

...

 .long sys_timer_delete

 .long sys_clock_settime

 .long sys_clock_gettime /* 280 */

 .long sys_clock_getres

 .long sys_clock_nanosleep

Необходимо добавить новый системный вызов в конец этого списка:

.long sys_foo

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

Далее необходимо добавить номер системного вызова в заголовочный файл include/asm/unistd.h, который сейчас выглядит примерно так.

/*

* This file contains the system call numbers.

*/

#define __NR_restart_syscall 0

#define __NR_exit 1

#define __NR_fork 2

#define __NR_read 3

#define __NR_write 4

#define __NR_open 5

...

#define __NR_mq_unlink       278

#define __NR_mq_timedsend    279

#define __NR_mq_timedreceive 280

#define __NR_mq_notify       281

#define __NR_mq_getsetattr   282

В конец файла добавляется следующая строка.

#define __NR_foo 283

В конце концов необходимо реализовать сам системный вызов foo(). Так как системный вызов должен быть вкомпилорован в образ ядра во всех конфигурациях, мы его поместим в файл kernel/sys.c. Код необходимо размещать в наиболее подходящем файле. Например, если функция относится к планированию выполнения процессов, то ее необходимо помещать в файл sched.c.

/*

* sys_foo - всеми любимый системный вызов.

*

* Возвращает размер стека ядра процесса

*/

asmlinkage long sys_foo(void) {

 return THREAD_SIZE;

}

Это все! Загрузите новое ядро. Теперь из пространства пользователя можно вызвать системную функцию foo().

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

1.4. Методология системного анализа и системного моделирования

Из книги Самоучитель UML автора Леоненков Александр

1.4. Методология системного анализа и системного моделирования Системный анализ как научное направление имеет более давнюю историю, чем ООП и ООАП, и собственный предмет исследования. Центральным понятием системного анализа является понятие системы, под которой


Окончательные выводы

Из книги Разгони свой сайт автора Мациевский Николай

Окончательные выводы Собственно, графики говорят сами за себя. Если у вас HTML-файлы в среднем больше 4 Кб, то появится ощутимый выигрыш для большинства пользователей при включенном gzip на сервере (даже если этот сервер находится на весьма «слабенькой» машине). В случае


Поддержка синхронного вызова

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Поддержка синхронного вызова Генерируемый агент определяет также поддержку синхронного вызова Web-методов. Например, синхронный вариант метода Subtract() реализуется так.public int Subtract(int x, int y) { object[] results = this.invoke("Subtract", new object[] {x, y}); return ((int)(results[0]));}Обратите внимание на то, что


Поддержка асинхронного вызова

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Поддержка асинхронного вызова Поддержка асинхронного вызова Web-методов в .NET 2.0 сильно изменилась по сравнению с .NET 1.x. По своему предыдущему опыту вы можете знать, что агенты .NET 1.1 использовали методы BeginXXX()/EndXXX() для вызова Web-методов во вторичном потоке выполнения.


Непрерываемость системного вызова door_call

Из книги О чём не пишут в книгах по Delphi автора Григорьев А. Б.

Непрерываемость системного вызова door_call Документация на door_call предупреждает, что эта функция не предполагает возможности перезапуска (библиотечная функция door_call делает системный вызов с тем же именем). Мы можем убедиться в этом, изменив процедуру сервера таким образом,


1.1.5. Функции обратного вызова

Из книги Интернет – легко и просто! автора Александров Егор

1.1.5. Функции обратного вызова Прежде чем двигаться дальше, необходимо разобраться с тем, что такое функции обратного вызова (callback functions: этот термин иногда также переводят "функции косвенного вызова"). Эти функции в программе описываются, но обычно не вызываются напрямую,


Особенности регистрации

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

Особенности регистрации Чтобы поисковая машина могла найти ваш сайт, его необходимо зарегистрировать. Причем регистрацию придется проходить на всех популярных поисковых серверах (если, конечно, вы хотите, чтобы их пользователи могли вас обнаружить). Хотя есть


Плата за регистрации

Из книги Инфобизнес на полную мощность [Удвоение продаж] автора Парабеллум Андрей Алексеевич

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


Не требуйте регистрации

Из книги Создаем вирус и антивирус автора Гульев Игорь А.

Не требуйте регистрации Ни в коем случае не принуждайте посетителя регистрироваться на сайте, чтобы оформить заказ. Если клиент нажимает на кнопку оплаты заказа, как правило, это значит, что он решил сделать покупку. Не надо ему мешать!Не нагружайте пользователя


Блок регистрации

Из книги Операционная система UNIX автора Робачевский Андрей М.

Блок регистрации Это обязательная составляющая, которая должна быть на главной странице. Самая большая проблема с данным блоком – отсутствие аргументации, зачем пользователю регистрироваться на сайте При этом человек должен понимать, зачем ему это делать и какие


Советы по регистрации

Из книги Разработка ядра Linux автора Лав Роберт

Советы по регистрации Никогда не стоит регистрироваться под настоящим именем, ведь неизвестно, к кому может попасть эта информация и для чего она будет использована. Можно взять любую телефонную базу, например, КОТИК или ее Online версию (http://www.xland.ru:8088/tel_win/owa/tel.form), и ввести


Семантика вызова

Из книги автора

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


15.5. Оператор вызова функции

Из книги автора

15.5. Оператор вызова функции Оператор вызова функции может быть перегружен для объектов типа класса. (Мы уже видели, как он используется, при рассмотрении объектов-функций в разделе 12.3.) Если определен класс, представляющий некоторую операцию, то для ее вызова


Определение необходимого системного вызова

Из книги автора

Определение необходимого системного вызова Простой переход в пространство ядра сам по себе не является достаточным, потому что существует много системных вызовов, каждый из которых осуществляет переход в режим ядра одинаковым образом. Поэтому ядру должен передаваться


Контекст системного вызова

Из книги автора

Контекст системного вызова Как уже обсуждалось в главе 3, "Управление процессами", при выполнении системного вызова ядро работает в контексте процесса. Указатель current указывает на текущее задание, которое и есть процессом, выполняющим системный вызов.В контексте процесса