记录一下,利用虚拟内存检测页表信息的方法
- 获得mm_struct 内存描述符
方法:1.利用调用内核函数,根据pid号可得
2.用全局变量current直接得到当前进程的信息 current->mm就是当前进程的内存描述符。上面两者方法都需要在内核中运行,也就是说需要用insmod 一个驱动的方法在内核中运行这些代码。所以放在init里面的话,current现在的进程就是insmod进程
2.根据mm_struct,得到顶层页表项pgd,然后根据pgd可以得到底层页表pte
3.根据pte,调用pte_wtire等函数可以得到这个页表的权限等信息
参考博客:https://blog.youkuaiyun.com/sdulibh/article/details/51892202
但还有个问题:
cat /proc/modules可以查看可加载内核模块的信息。
可以看到这个驱动只有1487字节,没有满足4k,但是里面包含了这个驱动的所有段,包括:init段,Text段,data段,rodata段等,那么明显data段和rodata段得分别在不同的页中,因为一个页只有一个权限,要么ro,要么rw。
然后我用上述方法测试了一下那个页表,显示是可写的。不对呀,raodata和text段应该是不可写才对
用同样的方法测试用户app,发现是满足rodata段和data段分别在两个页,中间应该有很大的空隙,不过确实一个页一个权限,没问题。
现在还是驱动的地方没搞明白。