linux vma,内存管理 – Linux内核API find_vma

find_vma函数功能描述:find_vma( )函数根据一个属于某个进程的虚拟地址,找到其所属的进程虚拟区间,并返回相应的vma_area_struct结构体指针。

find_vma文件包含

#include

find_vma函数定义

在内核源码中的位置:linux-3.19.3/mm/mmap.c

函数定义格式:

struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr)

find_vma输入参数说明

mm:是进程整个用户空间的抽象,也是总的控制结构,一个进程只有一个mm_struct结构,一个进程整个用户空间通常有若干离散的虚拟区间,这些虚拟区间由vm_area_struct结构描述。

addr:是进程用户空间中一虚拟地址,它属于某一虚拟区间。

find_vma返回参数说明

struct vm_area_struct是对进程虚拟区间抽象的数据结构,find_vma( )函数返回一个该结构类型指针,该指针指向描述进程中虚拟地址addr所在虚拟区间的结构体。

其中,struct mm_struct和struct vm_area_struct在文件linux-3.19.3/include/linux/mm_types.h中定义,它们的具体结构如下,这里对部分字段的含义进行了说明:

struct mm_struct {

struct vm_area_struct * mmap; /* 指向线性区对象的链表头 */

struct rb_root mm_rb;

u32 vmacache_seqnum; /*每一个线程的vmacache序列号*/

#if def CONFIG_MMU

/* 在进程地址空间忠搜索有效线性地址区间的方法 */

unsigned long (*get_unmapped_area) (struct file *filp, unsigned long addr,

unsigned long len, unsigned long pgoff, unsigned long flags);

#endif

/* 标识第一个分配的匿名线性区或文件内存映射的线性地址 */

unsigned long mmap_base;

unsigned long mmap_legacy_base;

unsigned long task_size;

unsigned long highest_vm_end;

/* 内核从这个地址开始搜索进程地址空间中线性地址的空闲区间 */

pgd_t * pgd; /*指向页全局目录 */

atomic_t mm_users; /* 次使用计数器 */

atomic_t mm_count; /* 主使用计数器*/

atomic_long_t nr_ptes; /*页表所在的页*/

int map_count; /* 线性区vma的个数 */

spinlock_t page_table_lock; /* 线性区的自旋锁和页表的自旋锁 */

struct rw_semaphore mmap_sem; /* 线性区的读/写信号量 */

struct list_head mmlist; /* 指向内存描述符链表中的相邻元素*/

unsigned long hiwater_rss;

unsigned long hiwater_vm;

/**total_vm指进程地址空间的大小(页数), locked_vm指“锁住”而不能换出的页的个数,

**shared_vm指共享文件内存映射中的页数,exec_vm指可执行内存映射中的页数*/

unsigned long total_vm, locked_vm, pinned_vm, shared_vm, exec_vm;

/*stack_vm指用户堆栈中的页数*/

unsigned long stack_vm, def_flags;

/*start_code指可执行的起始地址,end_code指可执行代码的最后地址,start_data

**指已初始化数据的起始地址,end_data指已初始化数据的最后地址*/

unsigned long start_code, end_code, start_data, end_data;

/*start_ brk指堆的起始地址,brk指堆的当前最后地址,start_ stack指用户态堆栈的起始地址*/

unsigned long start_brk, brk, start_stack;

/* arg_start指命令行参数起始地址,arg_end指命令行参数的最后地址,

**env_start指环境变量的起始地址,env_end指环境变量的最后地址*/

unsigned long arg_start, arg_end, env_start, env_end;

……

……

};

struct vm_area_struct {

unsigned long vm_start; /* 线性区的第一个线性地址 */

unsigned long vm_end; /* 线性区之后的第一个线性地址 */

struct vm_area_struct *vm_next, *vm_prev; /* 进程链表中的下一个线性区及上一个线性区*/

struct rb_node vm_rb; /* 用于红黑树的数据*/

unsigned long rb_subtree_gap;

struct mm_struct * vm_mm; /*指向线性区所在的内存描述符 */

pgprot_t vm_page_prot; /* 线性区中页框的访问许可权 */

unsigned long vm_flags; /* 线性区的标志*/

……

……

struct list_head anon_vma_node; /* 指向匿名线性区链表的指针 */

struct anon_vma * anon_vma; /* 指向anon_vma数据结构的指针 */

const struct vm_operations_struct * vm_ops; /* 指向线性区的方法 */

unsigned long vm_pgoff; /*在映射文件中的偏移量,对于匿名页,它等于0或vm_start/PAGE_SIZE*/

struct file * vm_file; /* 指向映射文件的文件对象 */

void * vm_private_data; /* 指向内存区的私有数据 */

……

……

};

find_vma实例解析

编写测试文件:find_vma.c

头文件及全局变量声明如下:

#include

#include

#include

#include

#include

MODULE_LICENSE("GPL");

static int __init find_vma_init(void);

static void __exit find_vma_exit(void);

模块初始化函数:

int __init find_vma_init(void)

{

struct mm_struct *mm ;

unsigned long addr ;

struct vm_area_struct * vma ;

mm = current->mm; //mm指向当前进程

addr = mm->mmap->vm_next->vm_start + 1;

printk("addr = 0x%lx\n", addr);

vma = find_vma(mm, addr);

if(vma ! = NULL )

{

/*输出所查找的虚拟区间的起始地址*/

printk("vma->vm_start = 0x%lx\n", vma->vm_start);

/*输出所查找虚拟区间的结束地址*/

printk("vma->vm_end = 0x%lx\n", vma->vm_end);

}

else

printk("UNLUCK! You have failed! \n");

return 0;

}

模块退出函数:

void __exit find_vma_exit(void)

{

printk("exit! \n");

}

模块初始化及退出函数调用:

module_init(find_vma_init);

module_exit(find_vma_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod find_vma.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

4c69487c3ecc680a0934d949ee1dbbf6.png

结果分析:

““mm = current->mm; ”`获取当前进程用户空间。

令“ addr = mm->mmap->vm_next->vm_start + 1; ”此时addr即为用户空间中的某一虚拟地址,这里为当前进程第二个虚拟区间的起始地址加1,由输出结果可知addr = 0x7fb896ce6001。然后调用find_vma( )函数查询addr所在的虚拟区间,将描述该虚拟区间的结构体指针赋值给vma,最后通过输出vma的vm_start和vm_end值验证了查找成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM项目中整合WebService

先了解一下WebService的一些相关术语吧: WebService:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 WSDL(web service definition language):WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文…

搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点

日前,美的与华为在智能家居行业又有大动作:双方将在2021年实现合作规模化,从运营和营销角度开展更多联合合作。美的鸿蒙新家电亮点包括:第一是极速配网,只要用手机碰一碰,基于WiFi Aware配网协议即可实现设…

excel android 公式,两个超实用的Excel万能公式,瞬间提升你10倍工作效率!

相信大家在平时的工作中,都会经常有用到公式的需要,但是下面这些公式你用过吗,今天小编就带大家一起看看吧!1. SUM函数这个函数不仅在我们学习的过程中会用到,即便到了工作后,也经常需要对各种数据进行处理…

Linux中常用命令(文件与目录)

1、pwd 查看当前目录(Print Working Directory)2、cd 切换工作目录(Change Directory)(1)格式:cd [目录位置]特殊目录:.当前目录..上一级目录~用户主目录-上个工作目录(2…

计算机操作系统(1):OS的作用和目标

OS的目标和作用 操作系统(Operating System , OS)是计算机硬件上的第一层软件,是计算机必须配置的最基本、最重要的系统软件。 1.1.1 OS的目标 有效性 方便性 可扩展性 开放性 1.有效性(早期OS的主要目标) 有效提高CPU和…

计算机操作系统(2):OS的发展过程

1.2 OS的发展过程 20世纪50年代中期,第一个简单的批处理系统 60年代中期,多道程序批处理系统,随后出现分时系统 上世纪80年代开始至21世纪初,微型机、多处理机、计算机网络大发展年代→微机OS、多处理机OS和网络OS的形成和大发展…

创建好centos7虚拟机之后连xshell连不上虚机

创建好虚拟机之后配置都已经配置完成了selinux,防火墙都关了准备用xshell 连接虚拟机报出 然后在网上着了各种资料还是不行,最后将网卡修改为: 修改之后就可以连上了。 当然修改之后会出现两个ip 必须得使用圈起来的ip连才可以,用…

android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。这里有一个示例代码,它包括三个类:开关组件视图、状态监听接口、MainActivity我们先来看看整个demo的效果图:我们先来看看…

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发(Concurrence) 并行与并发: 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下,并发性是指在一段时间内,宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image,返回结果的第一个,github上有10293个star,这就是我们想要搜索的结果: 使用命令docker pull把这个镜像拖下来: docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步:Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…

计算机操作系统(5):操作系统的结构设计

1.5 操作系统的结构设计 OS的结构经历了四代变革&#xff1a; 微内核OS结构——现代OS结构 微内核结构能有效地支持多处理机运行&#xff0c;故非常使用于分布式系统环境。 Windows NT采用微内核结构 在与微内核技术发展的同时&#xff0c;客户/服务器技术、面向对象技术…

Linux软链接和硬链接

Linux软链接和硬链接 1. 软链接link 定义&#xff1a;就是windows系统的快捷方式 作用&#xff1a;可以对硬盘空间进行合理分配 具体设置&#xff1a; ln -s 源文件 软链接 1.1 软链接使用注意 ① 设置软链接&#xff0c;如果软链接和源文件不在同一级目录&#xff0c;原…

项目管理(3):备战pmp

1组织结构与项目管理 2职能型组织的优缺点 优点 简单对专家更易于管理&#xff0c;管理更具灵活性只向一个上司汇报项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持员工可以不断得到提高缺点 项目经理没有足够的权力没有明确的责任人客户可能找不到专…

【leetcode】16 3Sum Closest

描述 给定一个数字集合 S 以及一个数字 target&#xff0c;需要从集合中找出3个数字的和与这个 target的值最接近&#xff08;绝对值最小&#xff09; 样例 Input: S [-1, 2, 1, -4], target 1Output: 2 思路 首先排序&#xff0c;之后确定一个数字的前提下&#xff0c;再利用…

项目管理(4):备战pmp

1单个项目管理过程 如何实现项目管理&#xff1f; 通过“过程”processes实现 大多数情况下&#xff0c;大多数项目都有共同的项目管理过程 项目管理知识提供的是good practice 应用这些过程能大大提高项目成功的机会 项目经理与项目团队的责任 确定哪些过程适用于具体给…

项目管理(6):备战pmp

项目整体管理 定义&#xff1a; 识别、定义、结合、统一与协调项目管理过程组中的各个过程以及项目管理活动 在各个相互冲突的目标与方案之间权衡取舍 在项目管理中发挥明显的重要作用 Eg&#xff1a;应急计划的成本估算成本管理时间管理风险管理 基本任务&#xff1a; …