当前位置: 技术问答>linux和unix
请求调页中的高端内存映射
来源: 互联网 发布时间:2017-02-07
本文导语: 今天看深入理解linux内核这本书的时候,在请求调页这一节里面有说道这样一个情况: if (write_access) { pte_unmap(page_table); spin_unlock(&mm->page_table_lock); page = alloc_page(GFP_HIGHUSER | _ _GFP_ZERO); spin_lo...
今天看深入理解linux内核这本书的时候,在请求调页这一节里面有说道这样一个情况:
if (write_access) {
pte_unmap(page_table);
spin_unlock(&mm->page_table_lock);
page = alloc_page(GFP_HIGHUSER | _ _GFP_ZERO);
spin_lock(&mm->page_table_lock);
page_table = pte_offset_map(pmd, addr);
mm->rss++;
entry = maybe_mkwrite(pte_mkdirty(mk_pte(page,
vma->vm_page_prot)), vma);
lru_cache_add_active(page);
SetPageReferenced(page);
set_pte(page_table, entry);
/*这里为什么要unmap*/
pte_unmap(page_table);
spin_unlock(&mm->page_table_lock);
return VM_FAULT_MINOR;
}
这样的一个函数,我想知道:
1.内核是如何访问进程空间的,是通过当前进程的pgd->pud->pmd->pte这样来访问的么,还是通过其他方式?
2.如果是通过这个方式访问的,那么,pud,pmd,这些目录会不会出现在高端内存中,物理地址896m以上的对内核都是高端内存,那么是不是说进程所有的页表对内核来说访问的时候都需要进行高端内存映射才能访问,这样是不是很费劲,还是说只是写的时候才要映射?
很迷糊,请各位大侠指点
if (write_access) {
pte_unmap(page_table);
spin_unlock(&mm->page_table_lock);
page = alloc_page(GFP_HIGHUSER | _ _GFP_ZERO);
spin_lock(&mm->page_table_lock);
page_table = pte_offset_map(pmd, addr);
mm->rss++;
entry = maybe_mkwrite(pte_mkdirty(mk_pte(page,
vma->vm_page_prot)), vma);
lru_cache_add_active(page);
SetPageReferenced(page);
set_pte(page_table, entry);
/*这里为什么要unmap*/
pte_unmap(page_table);
spin_unlock(&mm->page_table_lock);
return VM_FAULT_MINOR;
}
这样的一个函数,我想知道:
1.内核是如何访问进程空间的,是通过当前进程的pgd->pud->pmd->pte这样来访问的么,还是通过其他方式?
2.如果是通过这个方式访问的,那么,pud,pmd,这些目录会不会出现在高端内存中,物理地址896m以上的对内核都是高端内存,那么是不是说进程所有的页表对内核来说访问的时候都需要进行高端内存映射才能访问,这样是不是很费劲,还是说只是写的时候才要映射?
很迷糊,请各位大侠指点
|
1.必须是通过页表访问空间
2.页表都是进程创建时设置好的,不在高端,在普通区。
2.页表都是进程创建时设置好的,不在高端,在普通区。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。