memory-management - 从内核模块更改用户空间内存保护标志

标签 memory-management process linux-kernel mmap

我正在编写一个可以访问特定进程内存的内核模块。我使用do_mmap() 对一些用户空间内存进行了匿名映射。 :

#define MAP_FLAGS   (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)

prot = PROT_WRITE;
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0);
vaddrvsize设置较早,调用成功。从内核模块(通过 copy_to_user )写入该内存块后,我想删除 PROT_WRITE对它的许可(就像我在普通用户空间中使用 mprotect 一样)。我似乎找不到允许这样做的功能。

我尝试取消映射该区域并使用正确的保护重新映射它,但这会将内存块清零,删除我刚刚写入的所有数据;设置 MAP_UNINITIALIZED可能会解决这个问题,但是,从手册页:

MAP_UNINITIALIZED (since Linux 2.6.33)

Don't clear anonymous pages. This flag is intended to improve performance on embedded devices. This flag is only honored if the kernel was configured with the CONFIG_MMAP_ALLOW_UNINITIALIZED option. Because of the security implications, that option is normally enabled only on embedded devices (i.e., devices where one has complete control of the contents of user memory).



所以,虽然这可能会做我想要的,但它不会很便携。有没有标准的方法来完成我的建议?

最佳答案

经过一番研究,我发现了一个名为 get_user_pages() 的函数。 (我找到的最佳文档是 here )它返回给定地址的用户空间页面列表,可以使用 kmap() 映射到内核空间并以这种方式写入(在我的情况下,使用 kernel_read() )。这可以用作 copy_to_user() 的替代品因为它允许在检索到的页面上强制写入权限。唯一的缺点是您必须逐页编写,而不是一口气写完,但它确实解决了我在问题中描述的问题。

关于memory-management - 从内核模块更改用户空间内存保护标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11997129/

相关文章:

c++ - 两个线程之间是否有内存泄漏(缓冲,清空)

c++ - C++ 中是否存在内存泄漏 "undefined behavior"类问题?

linux-kernel - GPIO 更改状态时如何更新 sysfs?

从用户空间应用程序调用内核空间中的用户定义函数

java - 有什么方法可以处理 "flush"字符串吗?

C:程序即使在释放结构后仍打印垃圾文本

c - 如何启动进程并获取其输出?

linux - 在流程调用之间传输数据

java - 捕获java的输出

c - 当内核需要紧急释放内存时,JBD2中的检查点如何管理?