
VM_READ=0x01VM_WRITE=0x02VM_EXEC=0x04@H_419_12@因此,看来我的vm_flags说内存是读/写但vm_page_prot说它只是可读的(可执行标志在x86上没有意义).我的理解是vm_page_prot应该反映对VM区域中页面的页表条目的保护.当我进入用户空间的mmaped区域中的读/写内存时,页面错误机制正常工作,设置适当页面的PTE.某些页面(如果我只读取它们)被映射到特殊的零页面框架,PTE设置为只读,而其他页面被写入以将PTE设置为读/写.这是预期的行为……事实上,从mm / memory.c:
static int do_anonymous_page(struct mm_struct *mm,struct vm_area_struct *vma,unsigned long address,pte_t *page_table,pmd_t *pmd,unsigned int flags){ ... entry = pte_mkspecial(pfn_pte(my_zero_pfn(address),vma->vm_page_prot)); ...}@H_419_12@我的问题是什么决定了vm_page_prot.我的猜测是vm_page_prot在某种程度上是VM区域内所有页面权限的最严格的组合(交集),而vm_flags实际上描述了内存应该如何行动的真实意图.
有没有人对这两个领域的确切目的/差异有什么好的文章?
解决方法 注意这两个字段的C类型. vm_page_prot的类型是pgprot_t,它是一个arch级数据类型,这意味着它可以直接应用于底层架构的PTE.在x86 32位上,该字段存储VMA的PTE的适当保护位的内容.相反,vm_flags是一个与arch无关的字段,其位在linux / mm.h中定义.有许多VM_ *位,它们仅仅依赖于READ,WRITE和EXEC的简单标志.因此,在我看来,vm_page_prot是来自vm_flags的缓存转换的一种形式,它存储底层架构的适当保护位.请注意,在VMA中形成PTE的许多区域中,几乎直接使用pgprot_t.
总结以上是内存溢出为你收集整理的linux – vm_flags vs vm_page_prot全部内容,希望文章能够帮你解决linux – vm_flags vs vm_page_prot所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)