Как реализовать собственный системный вызов без перекомпиляции ядра Linux?

Я хочу реализовать свой собственный системный вызов. (см. ссылку ниже)

http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/

Но добавление нового системного вызова требует компиляции ядра.

Как реализовать собственный системный вызов без перекомпиляции ядра Linux?


person Amir Saniyan    schedule 20.06.2013    source источник


Ответы (2)


Вы не можете.

Без перекомпиляции ядра все, что вы можете сделать, это собрать и загрузить модули ядра, а модули ядра не могут добавлять новые системные вызовы.

person Community    schedule 20.06.2013
comment
Ну, это было коротко и мило. - person BoBTFish; 20.06.2013
comment
Ну, технически, в зависимости от места и прочего, с модулем ядра вы можете вставить свой собственный системный вызов в существующую таблицу системных вызовов. Но это грязно, ненадежно и определенно не очень хорошая идея. - person Mats Petersson; 20.06.2013
comment
Технически IOCTL — это системный вызов. Итак, когда вы можете использовать его для переноса ваших данных и общения между пользователями и ядром, зачем вам добавлять новый системный вызов? - person Ash; 21.06.2013
comment
@Ash: Правильно — вы, безусловно, можете добавить функциональность к существующим вызовам функций, например ioctl(), но вы не можете добавлять совершенно новые системные вызовы. - person ; 21.06.2013

Что вы можете.

Короче говоря, вам нужно пропатчить работающее ядро.

Есть как минимум 2 способа добавить новый системный вызов:

  1. Расширить существующие таблицы системных вызовов (sys_call_table и ia32_sys_call_table) и исправить инструкцию проверки лимита системных вызовов (обычно cmp на x86) в любой из записей системных вызовов (system_call, ia32_system_all и т. д.).
  2. Скопируйте существующие таблицы системных вызовов, расширьте их по мере необходимости, исправьте инструкцию диспетчеризации системных вызовов (обычно call на x86), чтобы она указывала на копию таблицы, и исправьте инструкцию проверки лимита системных вызовов в любой из записей системных вызовов.

Подробнее см. в этом ответе:

Реализация системного вызова Linux с использованием LKM

Как 32-разрядные приложения делают систему вызовы на 64-битном Linux?

:)

person Ilya Matveychikov    schedule 21.06.2013
comment
Метод, который вы описываете, невероятно уродлив и небезопасен — если вы не будете очень осторожны с ним, есть значительный шанс, что он приведет к сбою машины при загрузке. Ни при каких обстоятельствах я бы не рассматривал возможность использования модуля, который делал это в производственной системе. - person ; 21.06.2013
comment
Что касается метода, он работает, но важна реализация, вы правы. Правильная реализация требует сильных навыков и эта задача не для лохов :) - person Ilya Matveychikov; 21.06.2013