加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – vm_flags vs vm_page_prot

发布时间:2020-12-14 00:51:43 所属栏目:Linux 来源:网络整理
导读:我正在使用 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位,我的
我正在使用 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=0x01
VM_WRITE=0x02
VM_EXEC=0x04

因此,看来我的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));
    ...
}

我的问题是什么决定了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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读