在 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?或者这无关紧要?
一些建议会很好,提前谢谢你:)
最佳答案
在你的内核模块中,你可以将有效用户 ID 更改为 0,让它读取 /dev/kmem
,
关于linux - 更改内核页面权限以允许用户访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24403029/