控制内核中的函数指针

control a function pointer in the kernel

如果我在内核中控制了一个函数指针指向我想要的地方,让我们让它指向我在用户空间中自己设计的函数evil

err = writepage(page) //->writepage is a kernel function pointer pointing to a evil in the userland

evil中只有一个printf,如果内核取消引用该函数指针,是否会出现内核恐慌?由于 evil 在内核模式下运行(如果我错了请纠正我),但内核并不像 printf 那样。

int evil() {
   printf("I don't think printf will be executed because evil is executed is kernel mode")
}

内核永远不会看到“printf”;它看到对不同地址的调用,就像程序没有通过名称调用该函数,而是相应地设置包含参数的寄存器并调用该函数一样。

那是行不通的,因为 printf 调用指向的地址是相对于用户态进程的内存,并不存在于内核内存中。

您必须意识到进程 运行 在它们自己的虚拟内存中 -- none 程序中使用的地址需要对不同的进程有意义。

所以你不能甚至只是在用户态进程中调用一个函数;您首先必须找出内核看到它在内存中的位置,然后调用它。当然,它会在内核模式下 运行 ,但这并不奇怪——理智的 OS 不会允许用户进程以这种方式改变内部函数调用。