#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可能会修复它,但是,从手册页:
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 – 从内核模块更改用户空间内存保护标志全部内容,希望文章能够帮你解决memory-management – 从内核模块更改用户空间内存保护标志所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)