进程地址空间 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)
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

进程地址空间 find_vma()

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

对进程地址空间的一点认识

对进程地址空间的一点认识 在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。 一 早期的内存分配机制 在早期的计算机中,要运行一个程序,...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

LINUX进程地址空间

前边我已经说过了内核是如何管理物理内存。但事实是内核是操作系统的核心,不光管理本身的内存,还要管理进程的地址空间。linux操作系统采用虚拟内存技术,所有进程之间以虚拟方式共享内存。进程地址空间由每个...

进程地址空间

进程地址空间包含了某个进程可寻址的虚拟内存以及在此虚拟内存中进程可使用的地址。每个进程被分配了一个平坦的32或64位地址空间。不同的进程在各自的某个相同的内存地址处可以存储不同的数据。另外,进程之间也...

Linux进程地址空间

转自:http://blog.chinaunix.net/uid-27119491-id-3325943.html 下图是x86_64下linux进程的默认内存布局形式: 下面...

Linux进程地址空间

1.概述 进程地址空间由每个进程中的线性地址区组成,而且更为重要的特点是内核允许进程使用该空间的地址。进程地址空间中的任何有效地址只能位于惟一的区域,这些内存区域不能相互覆盖,可以看到,在执行进程中...

linux进程地址空间

开门见山,在arch/arm/kernel/sys_arm.c文件中,有这样三个函数:sys_fork、sys_vfork、sys_clone,它们都是在创建进程,分别对应系统调用fork()、vfo...

进程地址空间

前面讲“库”文件时说到:动态库的“函数”,有“函数地址”。其实不仅函数有地址,程序中的各种数据,都有地址。 5.4.1.什么叫进程 当程序安静地躺在硬盘上时,它是一个“文件”,非要给点区别的话,它...

进程地址空间

1, 内核除了管理本身的内存外,还必须管理用户空间中进程的内存 我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存 进程地址空间由进程可寻址的虚拟内存组成,而且更为重...

linux 进程地址空间

转自:草根老师博客:http://blog.chinaunix.net/uid-26833883-id-3193585.html 我们知道,在32位机器上linux操作系统中的进程的地址空间...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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