【发布时间】: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