Окончательные шаги регистрации системного вызова
Окончательные шаги регистрации системного вызова
После того как системный вызов написан, процедура его регистрации в качестве официального системного вызова тривиальна и состоит в следующем.
• Добавляется запись в конец таблицы системных вызовов. Это необходимо сделать для всех аппаратных платформ, которые поддерживают этот системный вызов (для большинства системных вызовов — это все возможные платформы). Положение системного вызова в таблице — это номер системного вызова, начиная с нуля. Например, десятая запись таблицы соответствует системному вызову с номером девять.
• Для всех поддерживаемых аппаратных платформ номер системной функции должен быть определен в файле 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().
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Определение необходимого системного вызова
Определение необходимого системного вызова Простой переход в пространство ядра сам по себе не является достаточным, потому что существует много системных вызовов, каждый из которых осуществляет переход в режим ядра одинаковым образом. Поэтому ядру должен передаваться
Контекст системного вызова
Контекст системного вызова Как уже обсуждалось в главе 3, "Управление процессами", при выполнении системного вызова ядро работает в контексте процесса. Указатель current указывает на текущее задание, которое и есть процессом, выполняющим системный вызов.В контексте процесса
Окончательные выводы
Окончательные выводы Собственно, графики говорят сами за себя. Если у вас HTML-файлы в среднем больше 4 Кб, то появится ощутимый выигрыш для большинства пользователей при включенном gzip на сервере (даже если этот сервер находится на весьма «слабенькой» машине). В случае
1.4. Методология системного анализа и системного моделирования
1.4. Методология системного анализа и системного моделирования Системный анализ как научное направление имеет более давнюю историю, чем ООП и ООАП, и собственный предмет исследования. Центральным понятием системного анализа является понятие системы, под которой
Семантика вызова
Семантика вызова Вызов локальной процедуры однозначно приводит к ее выполнению, после чего управление возвращается в головную программу. Иначе дело обстоит при вызове удаленной процедуры. Невозможно установить, когда конкретно будет выполняться процедура, будет ли она
Особенности регистрации
Особенности регистрации Чтобы поисковая машина могла найти ваш сайт, его необходимо зарегистрировать. Причем регистрацию придется проходить на всех популярных поисковых серверах (если, конечно, вы хотите, чтобы их пользователи могли вас обнаружить). Хотя есть
Плата за регистрации
Плата за регистрации Принцип тот же, что и в случае со щелчками, только вместо щелчков на баннерах необходимо регистрироваться на различных сайтах (рис. 7.5).Отличие от предыдущего способа также заключается в том, что за регистрации платят больше, чем за щелчки, однако и
Не требуйте регистрации
Не требуйте регистрации Ни в коем случае не принуждайте посетителя регистрироваться на сайте, чтобы оформить заказ. Если клиент нажимает на кнопку оплаты заказа, как правило, это значит, что он решил сделать покупку. Не надо ему мешать!Не нагружайте пользователя
Блок регистрации
Блок регистрации Это обязательная составляющая, которая должна быть на главной странице. Самая большая проблема с данным блоком – отсутствие аргументации, зачем пользователю регистрироваться на сайте При этом человек должен понимать, зачем ему это делать и какие
Непрерываемость системного вызова door_call
Непрерываемость системного вызова door_call Документация на door_call предупреждает, что эта функция не предполагает возможности перезапуска (библиотечная функция door_call делает системный вызов с тем же именем). Мы можем убедиться в этом, изменив процедуру сервера таким образом,
1.1.5. Функции обратного вызова
1.1.5. Функции обратного вызова Прежде чем двигаться дальше, необходимо разобраться с тем, что такое функции обратного вызова (callback functions: этот термин иногда также переводят "функции косвенного вызова"). Эти функции в программе описываются, но обычно не вызываются напрямую,
Поддержка синхронного вызова
Поддержка синхронного вызова Генерируемый агент определяет также поддержку синхронного вызова Web-методов. Например, синхронный вариант метода Subtract() реализуется так.public int Subtract(int x, int y) { object[] results = this.invoke("Subtract", new object[] {x, y}); return ((int)(results[0]));}Обратите внимание на то, что
Поддержка асинхронного вызова
Поддержка асинхронного вызова Поддержка асинхронного вызова Web-методов в .NET 2.0 сильно изменилась по сравнению с .NET 1.x. По своему предыдущему опыту вы можете знать, что агенты .NET 1.1 использовали методы BeginXXX()/EndXXX() для вызова Web-методов во вторичном потоке выполнения.
15.5. Оператор вызова функции
15.5. Оператор вызова функции Оператор вызова функции может быть перегружен для объектов типа класса. (Мы уже видели, как он используется, при рассмотрении объектов-функций в разделе 12.3.) Если определен класс, представляющий некоторую операцию, то для ее вызова
Советы по регистрации
Советы по регистрации Никогда не стоит регистрироваться под настоящим именем, ведь неизвестно, к кому может попасть эта информация и для чего она будет использована. Можно взять любую телефонную базу, например, КОТИК или ее Online версию (http://www.xland.ru:8088/tel_win/owa/tel.form), и ввести