我正在编写一个可以访问特定进程内存的内核模块。我已经对一些用户空间内存进行了匿名映射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
可能会解决这个问题,但是,从手册页:
MAP_UNINITIALIZED(自 Linux 2.6.33 起)
不要清除匿名页面。此标志旨在提高嵌入式设备的性能。仅当使用 CONFIG_MMAP_ALLOW_UNINITIALIZED 选项配置内核时才使用此标志。由于安全隐患,该选项通常仅在嵌入式设备上启用(即,可以完全控制用户内存内容的设备)。
所以,虽然这可能会做我想要的,但它不会很便携。有没有标准的方法来完成我的建议?