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