2014-06-25 152 views
0

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

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

以我内核模块,我改变相应的内核存储器页的访问位0×67从到0x63(低位比特111 - > 011)清除管理位。

之后,我使用invdpg指令刷新了虚拟地址0xc0001000的TLB。 我已确认我操作的页面条目的确是相应的。 但是,从用户应用程序访问0xC0001000仍然会导致分段错误。 我在这里错过了重要的东西吗?也许CS段和GDT?或者是不相关的?

一些建议是好的,谢谢你提前:)

回答

0

从你的内核模块你可以改变有效用户ID为0,以让它读/dev/kmem

+0

谢谢你,但是这不是什么我想......我想让用户应用程序(CPL3)直接访问内核虚拟地址。这是它自己的目标 – daehee

+0

@daehee嗯,'/ dev/kmem'是内核虚拟地址空间,对于用户空间应用程序来说,它需要的只是root权限。 –

相关问题