进程地址空间 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...
  • vanbreaker
  • vanbreaker
  • 2012年08月12日 11:16
  • 15323

从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
  • 5460

进程地址空间 find_vma()

进程地址空间 find_vma()find_vma()功能是查找给定地址的最邻近区,是寻找合适的线性地址空间至关重要的函数。find_vma()函数有两个参数:进程内存描述符的地址mm和线性地址add...
  • u013592097
  • u013592097
  • 2016年06月02日 10:46
  • 565

Linux内核设计与实现(第三版中文高清带目录)

  • 2018年01月22日 22:37
  • 36.74MB
  • 下载

内存管理API之find_vma

struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) 用于根据属于某个进程的虚拟地址,找到其所属的进程虚拟...
  • tiantao2012
  • tiantao2012
  • 2018年01月15日 08:52
  • 105

Linux进程地址空间分析

本文是操作系统课存储器管理学习完后老师的一些补充资料。较详细的介绍了Linux下进程地址空间的分配,并做了验证性实验。需要原始文档的,请点击下载。      验证性实验分为“一个进程地址空间的分析”和...
  • hjl243632044
  • hjl243632044
  • 2012年01月29日 18:45
  • 5417

虚拟内存实践

    实现目的: 通过实验了解虚拟内存  实验内容:在proc 文件系统下,我们建立一个文件,每次向这个文件写人字符时,调用相应的虚拟内存处理函数/* mtest_dump_vma_list():打...
  • LinuxKerneltravel
  • LinuxKerneltravel
  • 2010年11月04日 11:07
  • 4760

vma的基本操作

在Linux内核中,这样的区域被称之为虚拟内存区域(virtual memory areas),简称vma。一个vma就是一块连续的线性地址空间的抽象,它拥有自身的权限(可读,可写,可执行等等) ,...
  • farmwang
  • farmwang
  • 2017年04月12日 15:29
  • 546

Linux 下进程的地址空间布局

当前Linux下的应用程序都运行在内存空间里,在32位的系统中,可寻址内存空间的大小是4G, 也就是说在32位系统中,即使你的内存大于4G,Linux操作系统也只能使用0 ~ 4G地址的内存。应 ...
  • ASMARM
  • ASMARM
  • 2014年07月05日 14:56
  • 618

UC/OS II任务管理

UC/OS 初始化     在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。     OSIint()初始化μC/OS-Ⅱ所有的变量和...
  • softn
  • softn
  • 2016年07月13日 09:57
  • 349
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程地址空间 find_vma()
举报原因:
原因补充:

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