【问题标题】:Kernel Module memory access内核模块内存访问
【发布时间】:2019-08-07 04:25:55
【问题描述】:

我是内核模块的新手,目前正在试验它。 我读过它们与内核本身具有相同级别的访问权限。

这是否意味着他们可以访问物理内存并且可以查看/覆盖 其他进程(包括内核内存空间)的值?

我已经编写了这个简单的 C 代码来覆盖每个内存地址,但它没有做任何事情(预计系统会崩溃,不确定这是触及物理内存还是它仍然是虚拟内存)

我用sudo insmod ./test.ko 运行它,代码只是挂在那里(当然是因为无限循环)但是当我手动退出时系统工作正常。

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    unsigned char *p = 0x0;
    while (true){
      *p=0;
      p++;
    }

    return 0;
}

void cleanup_module(void)
{
    //
}

【问题讨论】:

  • 请注意,这也会删除正在运行的内核映像,因此它会在擦除所有内存之前停止。它也很可能会破坏一些文件系统细节。事先做好备份。
  • 此外,取消引用空指针将导致 Oops 并可能卸载您的模块。你可以考虑从1开始。
  • 但是我现在是在触摸物理内存,还是它仍然是虚拟内存?操作系统还会阻止我吗?
  • 您正在触摸虚拟内存。 C 标准将取消引用空指针视为未定义的行为。
  • @JL2210:不,事实并非如此。内核代码运行时仍然启用分页。在大多数架构上,内核确实在虚拟地址空间中的某处维护所有物理内存的映射(“内核直接映射”),但它不在虚拟地址零处。

标签: c linux linux-kernel kernel-module


【解决方案1】:

内核模块以内核权限运行(包括内核内存和所有外围设备)。您的代码不起作用的原因是您没有指定 initexit 模块。所以你可以加载模块,但内核不会调用你的方法。

请查看this 示例以获取最小内核模块。 Here 你会找到一些关于所需宏的解释。

【讨论】:

  • __init 和 __exit 是调用它们的新方式,您仍然可以使用旧的使用方式 init_modulecleanup_module
  • 是的,你是对的。我用较新版本的 Linux 模块检查了它。
猜你喜欢
  • 2015-10-05
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多