进程地址空间 find_vma()

原创 2016年06月02日 10:46:06

进程地址空间 find_vma()

find_vma()功能是查找给定地址的最邻近区,是寻找合适的线性地址空间至关重要的函数。find_vma()函数有两个参数:进程内存描述符的地址mm和线性地址addr。查找线性区的vm_end字段大于addr的第一个线性区的位置,并返回这个线性区描述符的地址;如果没有这样的线性区存在,就返回-个NULL指针。
补充:
内核用两个数据结构表示进程地址空间: struct mm_struct(内存描述符) 和 struct vm_area_struct(线性区描述符) 表示。
struct mm_struct 记录进程地址空间有关的全部信息,进程描述符struct task_struct中mm字段指向属于自己的mm_struct(内存描述符)。
struct vm_area_struct 记录进程使用每个线性区以及线性区的属性。内核中用两种数据结构组织每个进程所使用的线性区—-链表和红黑树,这样做的好处是加快查找的速度。struct mm_struct中mmap 和 mm_rb字段分别存放其链表头和红黑树根结点。

/* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
{
    struct rb_node *rb_node;
    struct vm_area_struct *vma;

    /* Check the cache first. */
    vma = vmacache_find(mm, addr);
    if (likely(vma))
        return vma;

    /* 查找第一个vm_end字段大于addr的线性区 */
    rb_node = mm->mm_rb.rb_node;

    while (rb_node) {
        struct vm_area_struct *tmp;

        tmp = rb_entry(rb_node, struct vm_area_struct, vm_rb);

        if (tmp->vm_end > addr) {
            vma = tmp;
            if (tmp->vm_start <= addr)
                break;
            rb_node = rb_node->rb_left;
        } else
            rb_node = rb_node->rb_right;
    }

/* 
 * vmacache_update : 将新得到的vma缓冲到struct task_struct中vmacache数组中,
 *                  提高下次查找的命中率.
 * 原因 : 程序中引用地址的局部性使下面这种情况出现的可能性很大,如果检查的最后一个
 *        线性地址属于某一给定的线性区,那么下一个要前差的线性地址也属于这个线性区。
 */
    if (vma)
        vmacache_update(addr, vma);
    return vma;
}

EXPORT_SYMBOL(find_vma)
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux进程地址空间--vma的基本操作

在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间。由于虚拟内存的引入,每个进程都可拥有3GB...

从find_vma和find_vma_prev看内核

首先看一个问题: Linux has both find_vma_prev and find_vma routines. find_vma_prev returns both the curren...
  • dog250
  • dog250
  • 2010年02月09日 20:21
  • 5228

Android U盘拔插提示音分析

U盘提示音源头追溯 对Android系统的架构,业务流程比较熟悉的老手来说就可以直接经验定位,迅速找到源码。 新手一般通过捕捉到字串,图片来找对应功能的源码略显笨拙,也是菜鸟期的必经之路。 其实...

取得Linux系统的各种统计信息

取得Linux系统的各种统计信息 本文基于Linux 2.6.x内核 一、取得CPU信息(相关文件/proc/stat) 在一个系...
  • plusboy
  • plusboy
  • 2007年03月13日 17:54
  • 5898

linux中程序存储结构和进程的地址空间

摘要:本文主要讲述了Linux系统中,程序存储结构(代码区、数据段和BBS区)与进程的基本结构(代码区、数据段、BBS区、堆和栈) 1.Linux程序存储结构 在Linux系统下,程序是一个普通的...
  • yyf_it
  • yyf_it
  • 2015年09月23日 14:54
  • 297

进程的地址空间:TEXT,DATA,BSS,HEAP,STACK

原文链接:http://harttle.com/2015/07/22/memory-segment.html 现代操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多...

Linux内核剖析 之 进程地址空间(二)

//接前一章,本节主要介绍线性区以及相关线性区的操作。 线性区 Linux通过类型为vm_area_struct的对象实现线性区。 vm_area_struct: struct vm_area_st...

进程的虚拟地址空间

转自:http://www.blogjava.net/bacoo/archive/2008/11/20/241586.html 进程的虚拟地址空间 昨晚看到了深夜,终于对进程的虚拟地址空间有了个大...
  • ab0ut
  • ab0ut
  • 2011年12月28日 13:06
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程地址空间 find_vma()
举报原因:
原因补充:

(最多只允许输入30个字)