UPDATE:
1. обработчик 0x80 по существу одинаков между 2,4 и 2.6, хотя функция, вызываемая из обработчика, вызывается обработчиком инструкций 'syscall' для x86-64 в 2.6.
2. обработчик 0x80 можно изменить так же, как и остальное ядро.
3. Вы ничего не сломаете, изменив его, если не удалите обратную совместимость. Например, вы можете добавить свой собственный след или бэкдор, если вы чувствуете такую склонность. Другой пост, в котором говорится, что вы сломаете свои библиотеки и набор инструментов, если вы измените обработчик, неверен. Если вы нарушите алгоритм диспетчеризации или неправильно измените таблицу диспетчеризации, вы все испортите.
3a. Как я писал ранее, лучший способ расширить службу 0x80 - это расширить обработчик системных вызовов.
Как говорит источник в ядре:
What: The kernel syscall interface
Description:
This interface matches much of the POSIX interface and is based
on it and other Unix based interfaces. It will only be added to
over time, and not have things removed from it.</p>
<pre><code> Note that this interface is different for every architecture
that Linux supports. Please see the architecture-specific
documentation for details on the syscall numbers that are to be
mapped to each syscall.
</code>
Записи таблицы системных вызовов для i386 находятся в:
arch/i386/kernel/syscall_table.S
Обратите внимание, что таблица представляет собой последовательность указателей, поэтому, если вы хотите поддерживать некоторую степень прямой совместимости с сопровождающими ядра, вам необходимо дополнить таблицу до размещения указателя.
Номер вектора системного вызова определен в irq_vectors
.h
Затем traps.c устанавливает адрес функции system_call
через set_system_gate
, которая помещает запись в таблицу дескрипторов прерываний. Сама функция system_call
находится в entry.S и вызывает запрошенный указатель из таблицы системных вызовов.
Есть несколько подробностей, которые вы можете увидеть, читая код, но прямое изменение обработчика прерываний 0x80 выполняется в entry.S внутри функции system_call
. Более разумным способом вы можете изменить таблицу системных вызовов, вставив свою собственную функцию без изменения механизма диспетчеризации.
Фактически, прочитав исходный код 2.6, он прямо говорит, что системные вызовы int 0x80 и x86-64 до сих пор используют один и тот же код. Таким образом, вы можете вносить переносимые изменения для x86-32 и x86-64.
КОНЕЦ Обновление
Метод INT 0x80 вызывает обработчик таблицы системных вызовов. Это сопоставляет аргументы регистра с таблицей вызовов, вызывая функции ядра на основе содержимого регистра EAX. Вы можете легко расширить таблицу системных вызовов для добавления пользовательских функций API ядра.
Это может даже работать с новым кодом системного вызова на x86-64, так как он также использует таблицу системных вызовов.
Если вы изменяете текущую таблицу системных вызовов иначе, чем расширяете ее, вы нарушаете все зависимые библиотеки и код, включая libc, init и т. Д.
Вот текущая таблица системных вызовов Linux: http://asm.sourceforge.net/syscall.html