Тема: Язык сборки PPC - модуль ядра Linux Loadble
Подробно: Как получить доступ к локальной области оглавления (r2) при вызове из ядра в ловушке таблицы syscall?
Я написал загружаемый модуль ядра для Linux, который использует перехват таблиц syscall для перехвата системных вызовов и записи информации о них перед передачей вызова исходному обработчику.Это часть продукта безопасности.Мой модуль работает хорошо и находится в производственном коде, работающем на большом разнообразии версий и дистрибутивов ядра Linux с 32- и 64-битными ядрами, работающими на оборудовании x86.
Я пытаюсь перенести этот код для запуска на Linuxдля процессоров КПП и столкнулся с несколькими проблемами.Используя исходный код ядра Linux, достаточно легко увидеть, как таблица системных вызовов по-разному реализована на PPC.Я могу заменить записи в таблице адресами функций из моих собственных скомпилированных обработчиков, без проблем.
Но вот проблема, с которой у меня проблемы.PPC ABI использует эту вещь, называемую адресом оглавления (TOC), который хранится в регистре R2 ЦПУ и ожидает адресации глобальных и локальных данных модуля, используя смещение адреса (адреса TOC), содержащегося в этом регистре.Это нормально работает в обычных случаях, когда выполняется вызов функции, потому что компилятор знает, что нужно загрузить адрес оглавления модуля в регистр перед выполнением вызова (или он уже существует, потому что обычно ваши функции вызываются вашим собственным кодом).
Однако, когда я помещаю адрес своей собственной функции (из моего загруженного модуля ядра во время выполнения) в таблицу системных вызовов, ядро вызывает мой обработчик со значением R2, которое не совпадает с ожидаемым моим скомпилированным кодом C, поэтому мойкод получает управление, не имея возможности доступа к своим данным.
Кто-нибудь знает какой-либо пример кода, показывающий, как справиться с этой ситуацией?Я не могу перекомпилировать ядро.Это должен быть простой случай перехвата таблиц системных вызовов во время выполнения, но мне еще предстоит выяснить это или найти какие-либо примеры, специфичные для PPC.
Идеи включают в себя:
Ручное кодирование заглушки на ассемблере, которая сохраняет значение R2, загружает регистр с моим локальным адресом оглавления, выполняет мой код, а затем восстанавливает старое значение перед вызовом исходного обработчика.У меня нет опыта сборки PPC, и я не уверен, что это сработает.
Какая-то волшебная опция gcc, которая генерирует мой код без использования TOC.Есть задокументированная опция gcc "-mno-toc"
, которая не работает на моем PPC6 Linux.Похоже, что это может быть только вариант для системы V.4 и встроенного PowerPC.
Любая помощь с благодарностью!
Спасибо!