0

在 x86 或 x64 Linux 中,我正在尝试制作一个内核模块来更改特定的内核页面权限以允许用户应用程序访问该内存。例如,如果在 0xC0001000 处有一个可读的内核页面(比如说它是 3:1 拆分),我想更改此页面的用户/主管位并允许用户应用程序执行类似的操作。

int* m = 0xC0001000;
printf("reading kernel memory from user : %08x\n", *m);

在我的内核模块中,我将相应内核内存页面的访问位从 0x67 更改为 0x63(低位 111 -> 011)以清除主管位。

之后,我使用 invdpg 指令刷新了虚拟地址 0xc0001000 的 TLB。我已经确认我操作的页面条目确实是对应的。但是,从用户应用程序访问 0xC0001000 仍然会导致我出现分段错误。我在这里错过了一些重要的事情吗?也许是cs段和GDT?还是那无关紧要?

一些建议会很好,提前谢谢你:)

4

1 回答 1

0

From your kernel module you can just change the effective user id to 0 to let it read /dev/kmem,

于 2014-06-25T10:59:41.363 回答