memory-management – 从内核模块更改用户空间内存保护标志
我正在编写一个可以访问特定进程内存的内核模块.我用do_mmap()对一些用户空间内存进行了匿名映射:
#define MAP_FLAGS (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS) prot = PROT_WRITE; retval = do_mmap(NULL,vaddr,vsize,prot,MAP_FLAGS,0); vaddr和vsize先前设置,调用成功.在我从内核模块(通过copy_to_user)写入该内存块后,我想删除它上面的PROT_WRITE权限(就像我在普通用户空间中使用mprotect一样).我似乎无法找到允许这样做的功能. 我试图取消映射该区域并使用正确的保护重新映射它,但是这会将内存块清零,删除我刚刚编写的所有数据;设置MAP_UNINITIALIZED可能会修复它,但是,从手册页:
所以,虽然这可能会做我想要的,但它不会很便携.有没有一种标准的方法来完成我的建议? 解决方法
经过一些研究,我发现了一个名为get_user_pages()的函数(我发现最好的文档是
here),它返回一个给定地址的用户空间页面列表,可以用kmap()映射到内核空间并写入方式(在我的例子中,使用kernel_read()).这可以用作copy_to_user()的替代品,因为它允许强制对检索到的页面进行写入权限.唯一的缺点是你必须逐页编写,而不是一次性编写,但它确实解决了我在我的问题中描述的问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |