在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?或者那是不相关的?
一些建议会很好,谢谢你提前:)