Chr*_*ris 4 linux linux-kernel
我与Linux内核2.6.38工作,有一个关于的两个领域的问题vm_area_struct
,vm_flags
和vm_page_prot
.如果我将私有匿名内存vm_flags
映射为可读写,然后打印出创建的vm_area_struct的两个字段,我看到低8位是0x73,低8位vm_page_prot
是0x25.我正在运行x86 32位,我的常量是
VM_READ=0x01
VM_WRITE=0x02
VM_EXEC=0x04
Run Code Online (Sandbox Code Playgroud)
因此,看来我的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));
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是什么决定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
几乎都是直接使用的.
归档时间: |
|
查看次数: |
4799 次 |
最近记录: |