1

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

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

4

3 回答 3

0

你不能只fsnotify在内核中使用,还是fanotify从用户空间使用?

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

于 2011-03-11T08:32:39.743 回答
0

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

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

于 2011-03-11T08:39:10.560 回答
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 注册。

于 2011-05-05T16:30:23.543 回答