Как подключить таблицу системных вызовов во время выполнения на PPC Linux? - PullRequest
4 голосов
/ 19 августа 2010

Тема: Язык сборки 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.

Любая помощь с благодарностью!

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

Linux имеет общую инфраструктуру аудита системных вызовов, которая работает на powerpc, и вы можете получить доступ из пользовательского пространства.Рассматривали ли вы использовать это вместо написания модуля ядра?

0 голосов
/ 08 сентября 2010

Для загрузки нужна заглушка r2.В исходном коде ядра есть примеры.

...