gpt4 book ai didi

linux - vm_flags 与 vm_page_prot

转载 作者:IT王子 更新时间:2023-10-29 01:10:48 30 4
gpt4 key购买 nike

我正在使用 linux 内核 2.6.38,并且对 vm_area_struct 的两个字段有疑问, vm_flagsvm_page_prot .如果我将私有(private)匿名内存映射为可读和可写,然后打印出创建的 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应该反射(reflect)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-independent字段,其位在linux/mm.h中定义。有许多 VM_* 位,它们在很大程度上扩展了 READ、WRITE 和 EXEC 的简单标志。

所以在我看来,vm_page_protvm_flags 的一种缓存转换形式,它为底层架构存储适当的保护位。请注意,在 VMA 中形成 PTE 的许多区域中,几乎直接使用了 pgprot_t

关于linux - vm_flags 与 vm_page_prot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035504/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com