linux – vm_flags vs vm_page_prot

linux – vm_flags vs vm_page_prot,第1张

概述我正在使用 Linux内核2.6.38,并对vm_area_struct,vm_flags和vm_page_prot的两个字段有疑问.如果我将私有匿名内存映射为可读写,然后打印出创建的vm_area_struct的两个字段,我看到vm_flags的低8位是0x73,而vm_page_prot的低8位是0x25.我正在运行x86 32位,我的常量是 VM_READ=0x01VM_WRITE=0x0 我正在使用 Linux内核2.6.38,并对vm_area_struct,vm_flags和vm_page_prot的两个字段有疑问.如果我将私有匿名内存映射为可读写,然后打印出创建的vm_area_struct的两个字段,我看到vm_flags的低8位是0x73,而vm_page_prot的低8位是0x25.我正在运行x86 32位,我的常量是

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/1024959.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存