LSM-Howto:具有非导出函数的Kernelmodule

时间:2011-03-10 16:45:40

标签: linux-kernel compilation patch

我目前正在编写Linux内核模块,该模块依赖于Linux安全模块(LSM),目前它并不是真的,我只是想在打开文件时打印出一条简单的消息。问题是:要注册到钩子,我需要函数register_security,这是我在googleing之后发现的 - 不再导出,因此不能被可加载的内核模块使用 - 只能由直接编译到内核中的模块使用。 当然这对于安全模块来说是有意义的,但它对我的开发很有帮助。 所以现在问题是:有没有办法将我的模块修补到内核中?我的意思是,我不希望在每个错误修复或每次微小更改后重新编译我的内核。我可以忍受每次重新尝试重新启动我的电脑,但重新编译需要花费一点时间我猜...

编辑:嗯,还没有人:(我刚才有一个想法,也许有人可以告诉我它是否好):我不能只在内核源代码中为我需要的函数添加EXPORT_SYMBOL,然后重新编译它然后将我的代码添加为模块?当然这只是用于测试和调试

3 个答案:

答案 0 :(得分:0)

你不能只在内核中使用fsnotify,或者在用户空间使用fanotify吗?

导出函数通常不是一个好主意,作者认为导出不是一个好主意。如果你调用的函数不是公共接口的一部分而且该函数有副作用,你可能会破坏它。此外,你的模块不能在其他机器上运行,但也许你不关心这个。

答案 1 :(得分:0)

不,没有。如果未导出符号,则内核中链接器将无法找到它。但是将导出添加到用于测试的内核应该没问题。您可以将模块添加到导出列表中,方法是将其添加到./include/linux/Kbuild。

此外,如果在(user-mode-linux)[http://user-mode-linux.sourceforge.net/]或虚拟框中进行测试,重新编译整个内核可能不是那么大的问题。

答案 2 :(得分:0)

这可能有点晚了,因为我一会儿看到你的问题。我发现这是一个很好的解决方案是编写一个编译到内核中的模块,然后只输出你要使用的几个函数。

例如

//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。