Модуль ядра Linux для проверки целостности памяти - PullRequest
1 голос
/ 01 сентября 2011

Я пишу модуль ядра, который проверяет целостность сегментов кода для запуска задач, контролируя контрольные суммы.Я столкнулся с несколькими препятствиями:

  1. Как мне получить переменную module_list, если она не экспортируется ядром (такого символа нет в ksyms)?Я вижу все модули, вызывающие команду lsmod, так как я могу получить ее в моем модуле?
  2. Когда мой модуль работает, он показывает, что некоторые сегменты кода были изменены.Это всегда происходит с определенными библиотеками.Почему это происходит?Я думал, что сегменты кода были постоянными.
  3. Можно ли контролировать доступ к памяти для данных процесса из модуля ядра и как это сделать?

1 Ответ

5 голосов
/ 01 сентября 2011

Самоизменяющийся код полностью поддерживается.В этом нет ничего плохого, и он используется для всех видов вещей.Ваше предположение, что код является константой, просто неверно.Это может быть, но может и не быть.

Один типичный пример - системы SMP и UP.Например, на машинах класса Pentium 4 Xeon разблокированный шаг может занять на 60 циклов меньше, чем заблокированный шаг.Блокированный прирост необходим только на машинах SMP.Чтобы заставить один и тот же код работать на компьютерах UP и SMP без накладных расходов на условие во время выполнения, обычно используется самоизменяющийся код.Вместо инструкции lock используется недопустимый код операции, такой как ud2.Прерывается недопустимое прерывание инструкции, и ud2 заменяется на lock в системе SMP и nop в системе UP.

Ядро экспортирует интерфейс модуля.Экспортируются:

__module_text_address __symbol_get symbol_put_addr use_module
module_layout module_put __module_put_and_exit module_refcount 
register_module_notifier __symbol_put unregister_module_notifier module_get 

Вы также можете проанализировать /proc/modules, если действительно хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...