Подтвердить что ты не робот

Ядро Linux - динамически добавлять системный вызов через модуль

Есть ли способ добавить динамический динамический вызов, например, через модуль? Я нашел места, где я могу переопределить существующий системный вызов с помощью модуля, просто изменив массив sys_call_table[], чтобы получить мою переопределенную функцию вместо native, когда мой модуль установлен, но вы можете сделать это с помощью нового системного вызова и модуль?

4b9b3361

Ответ 2

Зак, да можно: D

Хотя sys_call_table имеет фиксированный размер, в некоторых случаях в таблице могут быть свободные позиции

Посмотрите эти ссылки:
lxr.free-electrons.com/source/arch/x86/kernel/syscall_32.c
lxr.free-electrons.com/source/arch/x86/kernel/syscall_64.c

  • Во-первых, ядро ​​заполняет все позиции sys_call_table указателем на sys_ni_syscall

  • При компиляции файлы asm/syscalls_32.h и asm/syscalls_64.h созданный на основе следующих таблиц:

lxr.free-electrons.com/source/arch/x86/syscalls/syscall_32.tbl
lxr.free-electrons.com/source/arch/x86/syscalls/syscall_64.tbl

Вкратце рассмотрев эти таблицы, вы увидите, что некоторые позиции будут продолжены указав на sys_ni_syscall, например, позиции 17, 31, 32, 35,..., syscall_32.tbl поскольку они не реализованы.

Поэтому наша единственная задача - идентифицировать эти позиции и "зарегистрировать" наш новый системный вызов.

Я положил что-то похожее на мой git
https://github.com/MrN0body/rsysadd

Ответ 3

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

Обычно для драйверов правильным способом является использование вызова ioctl(), который является всего лишь одним системным вызовом, но он может вызывать различные функции ядра или модули драйверов - передавая различные параметры через ioctl().

Вышеупомянутое предназначено для выполнения кода ядра, управляемого пользователем.

Для передачи данных вы можете использовать драйверы procfs или sysfs для разговора с ядром.

PS: когда вы перехватываете системный вызов, который обычно влияет на всю ОС, вам нужно беспокоиться о том, как решить проблему безопасного его использования: что, если кто-то еще на второй половине времени вызывает системный вызов, а затем вы изменяете/перехватываете коды?