当前位置:  技术问答>linux和unix

insert_vm_struct 函数问题请教

    来源: 互联网  发布时间:2016-05-03

    本文导语:  /* Insert vm structure into process list sorted by address  * and into the inode's i_mmap ring.  If vm_file is non-NULL  * then the i_shared_lock must be held here.  */ void __insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma) { struct vm_...


/* Insert vm structure into process list sorted by address
 * and into the inode's i_mmap ring.  If vm_file is non-NULL
 * then the i_shared_lock must be held here.
 */
void __insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
{
struct vm_area_struct * __vma, * prev;
rb_node_t ** rb_link, * rb_parent;

__vma = find_vma_prepare(mm, vma->vm_start, &prev, &rb_link, &rb_parent);
if (__vma && __vma->vm_start vm_end)
BUG();
__vma_link(mm, vma, prev, rb_link, rb_parent);
mm->map_count++;
validate_mm(mm);
}

find_vma_prepare(mm, vma->vm_start, &prev, &rb_link, &rb_parent);为什么要这样判断?这种情况可能出现吗?

find_vma_prepare这个函数的作用是什么?

|
楼上说得没错,只是少说了一点。

有几个点:

*) 关于每个进程所有的地址空间用到的vm_area_struct是通过链表和红黑树两种数据结构来做遍历的。
*) find_vma_prepare是找需要插入的红黑树的位置,以及要插入链表的位置,
__vm_link就是实际来干插入这个事的。
*) if (__vma && __vma->vm_start vm_end) 这个判断是看看要插入的vma跟已有的有没有重叠的
里面有个点:find_vma_prepare和find_vma本质是一样的:它的返回值就两种结果:
 (!vma || addr vm_end),即要么NULL,要么vma->vm_start vm_end. 
注意理解“Notice that the region selected by find_vma( ) does not necessarily include addr because addr may lie outside of any memory region.”


你可以参考 Understanding The Linux Kernel 3rd 的9.3. Memory Regions
配合代码看。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3