gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:37:15 25 4
gpt4 key购买 nike

我正在编写一个可以访问特定进程内存的内核模块。我使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com