Наши партнеры

UnixForum



  • Микронаушник спб
  • Все микронаушники : Магнитные и телестного цвета. Bluetooth и hands-free
  • microstore.su


Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра 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 пространства пользователя   Отладка в ядре