Я занимаюсь ядром для небольшого летнего исследования. Мы планируем внести изменения в TCP в конкретных расчетах RTT. Я бы хотел заменить разрешение одной из функций в tcp_input.c на функцию, предоставляемую динамически загружаемым модулем ядра. Я думаю, что это улучшит темпы разработки и распространения модификации.
Интересующая меня функция была объявлена как статическая, однако я перекомпилировал ядро с нестатической функцией и экспортировал ее с помощью EXPORT_SYMBOL. Это означает, что функция теперь доступна для других модулей / частей ядра. Я проверил это с помощью "cat / proc / kallsyms".
Теперь я хотел бы иметь возможность загрузить модуль, который может переписать адрес символа с исходного на мою динамически загружаемую функцию. Точно так же, когда модуль должен быть выгружен, он восстановит исходный адрес. Это осуществимый подход? У всех есть предложения, как это можно было бы лучше реализовать?
Спасибо!
То же, что и Переопределение функциональности модулями в ядре Linux а>
Изменить:
Это был мой возможный подход.
Учитывая следующую функцию (которую я хотел переопределить и не экспортируется):
static void internal_function(void)
{
// do something interesting
return;
}
изменить так:
static void internal_function_original(void)
{
// do something interesting
return;
}
static void (*internal_function)(void) = &internal_function_original;
EXPORT_SYMBOL(internal_function);
Это переопределяет ожидаемый идентификатор функции вместо указателя функции (который может вызываться аналогичным образом), указывающего на исходную реализацию. EXPORT_SYMBOL () делает адрес глобально доступным, поэтому мы можем изменить его из модуля (или другого местоположения ядра).
Теперь вы можете написать модуль ядра в следующем виде:
static void (*original_function_reference)(void);
extern void (*internal_function)(void);
static void new_function_implementation(void)
{
// do something new and interesting
// return
}
int init_module(void)
{
original_function_reference = internal_function;
internal_function = &new_function_implementation;
return 0;
}
void cleanup_module(void)
{
internal_function = original_function_reference;
}
Этот модуль заменяет исходную реализацию динамически загружаемой версией. При выгрузке исходная ссылка (и реализация) восстанавливаются. В моем конкретном случае я предоставил новую оценку RTT в TCP. Используя модуль, я могу вносить небольшие изменения и перезапускать тестирование без перекомпиляции и перезагрузки ядра.