LSM-Howto: модуль ядра с неэкспортированными функциями - PullRequest
1 голос
/ 10 марта 2011

В настоящее время я пишу модуль ядра Linux, который зависит от модулей безопасности Linux (LSM), на данный момент это ничего особенного, я просто хотел распечатать простое сообщение при каждом открытии файла. Проблема в том, что для регистрации на хук мне нужна функция register_security, которая - как я выяснил после googleing - больше не экспортируется и поэтому не может использоваться загружаемыми модулями ядра - только модулями, которые скомпилированы непосредственно в ядре , Конечно, это имеет смысл для модуля безопасности, но для меня это отстой. Итак, теперь вопрос к вам: есть ли способ залатать мой модуль в ядро? Я имею в виду, я не хочу перекомпилировать свое ядро ​​после каждого исправления или каждого незначительного изменения. Я мог бы жить с перезагрузкой моего компьютера для каждой новой попытки, но, думаю, перекомпиляция займет немного больше времени ...

Редактировать: Хм, еще нет :( У меня только была идея, может кто-то может сказать мне, хорошо это или нет: я не могу просто добавить EXPORT_SYMBOL в исходный код ядра для нужных мне функций, затем перекомпилировать его и затем добавить мой код в качестве модуля? Конечно, это будет только для тестирования и отладки

Ответы [ 3 ]

0 голосов
/ 11 марта 2011

Нет, нет. Когда символ не экспортируется, компоновщик в ядре не сможет его найти. Но добавление экспорта в ядро, которое вы используете для тестирования, должно быть в порядке. Вы можете добавить свой модуль в список экспорта, добавив его в ./include/linux/Kbuild.

Кроме того, если тестирование выполняется в (user-mode-linux) [http://user -mode-linux.sourceforge.net /] или в виртуальной коробке, перекомпиляция всего ядра может не быть такой большой проблемой.

0 голосов
/ 05 мая 2011

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

Например

//REGISTER FILE_PERMISSION
static void k_register_file_permission(int (*my_file_permission) (struct file *file, int mask)) {
  my_file_permission_func = my_file_permission;
}
EXPORT_SYMBOL(k_register_file_permission);

Тогда вы можете просто вызвать k_register_file_permission из вашего модуля ядра, что удобно во время процесса разработки.

Вам также понадобится такая функция, как

int k_file_permission (struct file *file, int mask) {
  if(my_file_permission_func == NULL) 
  {
    //do nothing
  }
  else
  {
    return my_file_permission_func(file, mask);
  }
  return 0;
}

Что бы вы зарегистрировались в LSM во время загрузки.

0 голосов
/ 11 марта 2011

Разве вы не можете просто использовать fsnotify в ядре или fanotify из пространства пользователя?

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

...