Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Вперед |
Модификация системных вызовов
Системные вызовы из пользовательских процессов, как это детально обсуждалось ранее, все проходят через таблицу с именем sys_call_table (это своего рода case-селектор, который передаёт управление на обработчик требуемого запроса). Иногда хотелось бы подменить или добавить позицию (адрес обработчика) в таблице (это техника, благополучно известная программистам ещё со времён MS-DOS). Такая модификация бывает нужна, например (этим перечень возможностей далеко не исчерпывается):
- Для мониторинга и накопления статистики по какому-либо существующему системному вызову;
- Для добавления собственного обработчика нового системного вызова, используемого прикладными программами пакета;
- Так делают программы-вирусы или недоброжелательные программы, пытающиеся перехватить контроль над компьютером;
До определённого времени (до версии 2.6) ядро экспортировало адрес таблицы переходов системных вызовов sys_call_table[]. На сейчас, этот символ может присутствовать в таблице имён ядра (/proc/kallsyms), но не экспортируется для использования модулями (нужен тип T):
$ cat /proc/kallsyms | grep 'sys_call'
c052476b t proc_sys_call_handler c07ab3d8 R sys_call_table
Тем не менее, ядро всегда импортирует символ sys_close, находящийся в начальных позициях таблицы sys_call_table[]:
$ cat /proc/kallsyms | grep sys_close
c047047a T sys_close
Предыдущий раздел: | Оглавление | Следующий раздел: |
Операции I/O пространства пользователя | Отладка в ядре |