Переопределение функциональности с помощью модулей в ядре Linux - PullRequest
20 голосов
/ 14 ноября 2008

Не вдаваясь в подробности , почему , я ищу чистый (насколько это возможно) способ замены функций ядра и системных вызовов из загружаемого модуля. Моя первоначальная идея состояла в том, чтобы написать некоторый код для переопределения некоторых функций, который бы взял исходную функцию (возможно, если это возможно, , вызовет функцию), а затем добавил часть своего собственного кода. Ключевым моментом является то, что функция, которую я пишу, должна иметь имя исходной функции, поэтому другой код при попытке получить к ней доступ вместо моего.

Я могу легко (сравнительно) сделать это непосредственно в ядре, просто добавив свой код в соответствующие функции, но мне было интересно, знает ли кто-нибудь немного магии С, которая не обязательно обязательно ужасное ядро ​​( или C) практика кодирования, которая могла бы достичь того же результата.

Мысли о #defines и typedefs приходят на ум, но я не могу разобраться с этим в моей голове.

Вкратце: кто-нибудь знает способ эффективного переопределения функций в ядре Linux (из модуля)?

РЕДАКТИРОВАТЬ: Так как это было задано, я, по сути, хочу регистрировать определенные функции (создание / удаление каталогов и т. Д.) изнутри ядра , но для здравомыслия, загружаемый модуль, кажется, имеет смысл вместо того, чтобы писать большой патч для кода ядра и перекомпилировать при каждом изменении. Минимальное количество добавляемого кода в ядро ​​это нормально, но я хочу перенести большую часть работы в модуль.

Ответы [ 13 ]

0 голосов
/ 15 ноября 2008

Вы не хотите изменять существующие системные вызовы, вы хотите их обработать. Вот для чего SystemTap . Если вы действительно хотите сделать это сложным способом и перехватывать системные вызовы, кодируя свой собственный модуль, я предлагаю вам прочитать некоторую литературу по руткитам, но у меня нет никакой удобной ссылки (хотя на ум приходит phrack).

0 голосов
/ 14 ноября 2008

Так как вы хотите регистрировать только вызовы (т.е. вы не будете переопределять их на самом деле), и небольшое количество изменений в коде ядра приемлемо, самый простой способ - добавить хук для каждой интересующей вас функции. (используя цепочку уведомлений или даже простой указатель на функцию). Затем ваш модуль просто регистрирует себя во всех добавленных вами хуках (и отменяет их регистрацию при выгрузке).

Также вполне возможно, что кто-то другой уже проделал работу по добавлению хуков для вас.

0 голосов
/ 14 ноября 2008

Большая часть работы с файловой системой уже выполняется в модулях, при условии, что код файловой системы был построен как модуль, а не встроен в ядро ​​(что означает, что «реальный» ответ зависит от параметров сборки ядра).

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

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

...