linux - 更改内核页面权限以允许用户访问

标签 linux segmentation-fault kernel mmu

在 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/

相关文章:

c++ - 可以在不取消引用的情况下增加指针仍然是段错误或具有其他(未)定义的肮脏吗?

CS50 PSET3 恢复段错误,无法获取输出 JPEG 的代码

linux - 使用用户空间进程来协助内核模块

c - 父 c 中 wait() 的目的

linux - 如何 grep 2 或 3 行,其中包含我想要的文本,其他的就在它下面

python - 查找由 python 脚本调用的出现段错误的 C 模块行

kernel - 内核中的native_write_msr是做什么的?

import - pymssql.connect 错误 - 意外的关键字参数 'server'

linux - 在 Makefile 命令后检查日志的最佳方法

c++ - 使用单调时钟的绝对时间