Есть ли способ добавить динамический динамический вызов, например, через модуль? Я нашел места, где я могу переопределить существующий системный вызов с помощью модуля, просто изменив массив sys_call_table[]
, чтобы получить мою переопределенную функцию вместо native, когда мой модуль установлен, но вы можете сделать это с помощью нового системного вызова и модуль?
Ядро Linux - динамически добавлять системный вызов через модуль
Ответ 1
Нет, sys_call_table
имеет фиксированный размер:
const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { ...
Лучшее, что вы можете сделать, как вы, вероятно, уже обнаружили, - перехватить существующие системные вызовы.
Ответ 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: когда вы перехватываете системный вызов, который обычно влияет на всю ОС, вам нужно беспокоиться о том, как решить проблему безопасного его использования: что, если кто-то еще на второй половине времени вызывает системный вызов, а затем вы изменяете/перехватываете коды?