Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )

【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )

作者头像
韩曙亮
发布于 2023-03-30 06:29:23
发布于 2023-03-30 06:29:23
2K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

在博客 【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( vm_area_struct 结构体成员分析 | vm_start | vm_end | vm_next | vm_prev |vm_rb) 中 , 分析了 vm_start vm_end vm_next vm_prev vm_rb

5

个结构体成员作用 ;

在博客 【Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct 结构体成员分析 | vm_mm 成员 | vm_page_prot 成员 | vm_flags 成员 ) 中 , 分析了 vm_area_struct 结构体中的 vm_mm vm_page_prot vm_flags 成员作用 ;

在博客 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 ) 中 , 分析了 vm_area_struct 结构体中的 shared anon_vma_chain anon_vma 成员作用 ;

一、vm_area_struct 结构体成员分析


1、vm_ops 成员

vm_ops 成员是 " 虚拟内存操作集合 " , 该 vm_operations_struct 结构体中封装了大量的虚拟内存操作 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/* Function pointers to deal with this struct. */
	const struct vm_operations_struct *vm_ops;

二、vm_operations_struct 结构体成员分析


vm_operations_struct 结构体 定义在 Linux 内核源码的 linux-4.12\include\linux\mm.h#361 位置 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * These are the virtual MM functions - opening of an area, closing and
 * unmapping it (needed to keep files on disk up-to-date etc), pointer
 * to the functions called when a no-page or a wp-page exception occurs. 
 */
struct vm_operations_struct {
	void (*open)(struct vm_area_struct * area);
	void (*close)(struct vm_area_struct * area);
	int (*mremap)(struct vm_area_struct * area);
	int (*fault)(struct vm_fault *vmf);
	int (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size);
	void (*map_pages)(struct vm_fault *vmf,
			pgoff_t start_pgoff, pgoff_t end_pgoff);

下面对 vm_operations_struct 结构体成员进行分析 ;

1、open 函数指针

open 函数指针 , 指向的函数 , 在 创建 " 虚拟内存区域 " 时调用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	void (*open)(struct vm_area_struct * area);

2、close 函数指针

close 函数指针 , 指向的函数 , 在 删除 " 虚拟内存区域 " 时调用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	void (*close)(struct vm_area_struct * area);

3、mremap 函数指针

mremap 函数指针 , 指向的函数 , 在 使用系统调用 mremap 函数 移动 " 虚拟内存区域 " 时调用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int (*mremap)(struct vm_area_struct * area);

4、fault 函数指针

【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 ) 博客中 , 介绍了内存映射的原理 , 分配 " 虚拟内存区域 " 后 ,

第一次访问会产生 " 缺页异常 " ,

之后对于 " 文件映射 " , 如果没有映射 " 物理内存页 " , 就会回调 fault 函数 , 将 文件中的数据 读取到 " 物理内存页 " 中 ;

fault 函数指针 , 指向的函数 , 就是在 回调 fault 函数时 时调用 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int (*fault)(struct vm_fault *vmf);

5、huge_fault 函数指针

huge_fault 函数指针 , 与上面的 fault 函数指针类似 , 只是 huge_fault 函数指针针对的是 使用 " 透明巨型页 " 的文件映射 的情况 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	int (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size);

6、map_pages 函数指针

【Linux 内核 内存管理】内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 ) 博客中 , 介绍了内存映射的原理 , 分配 " 虚拟内存区域 " 后 ,

第一次访问 " 文件映射 " 对应的 " 虚拟内存页 " 时 , 如果发现 文件 没有映射到该 " 虚拟内存页中 " , 会报 " 缺页异常 " ,

" 异常处理程序 " 会读取 正在访问的文件页 , 以及 预读取 后续的文件页 ,

调用 map_pages 函数指针指向的函数 , 为 文件页 分配 " 物理内存页 " ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	void (*map_pages)(struct vm_fault *vmf,
			pgoff_t start_pgoff, pgoff_t end_pgoff);

7、page_mkwrite 函数指针

要 修改 " 私有文件映射 " 对应的 " 虚拟文件页 " 时 ,

如果是 第一次 写该 内存映射 时 , 会生成 " 页错误异常 " ,

" 异常处理程序 " 会执行 " 写复制 " 机制 ,

调用该 page_mkwrite 函数指针指向的函数 , 通知该 " 文件页 " 马上要变成可写状态 ,

此时 " 文件系统 " 会检查该 写操作 是否合法 , 是否允许修改该 文件页 , 是否需要等待以便进入合适的状态再进行写操作 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	/* notification that a previously read-only page is about to become
	 * writable, if an error is returned it will cause a SIGBUS */
	int (*page_mkwrite)(struct vm_fault *vmf);

三、vm_area_struct 结构体完整源码


vm_area_struct 结构体完整源码 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * This struct defines a memory VMM memory area. There is one of these
 * per VM-area/task.  A VM area is any part of the process virtual memory
 * space that has a special rule for the page-fault handlers (ie a shared
 * library, the executable area etc).
 */
struct vm_area_struct {
	/* The first cache line has the info for VMA tree walking. */

	unsigned long vm_start;		/* Our start address within vm_mm. */
	unsigned long vm_end;		/* The first byte after our end address
					   within vm_mm. */

	/* linked list of VM areas per task, sorted by address */
	struct vm_area_struct *vm_next, *vm_prev;

	struct rb_node vm_rb;

	/*
	 * Largest free memory gap in bytes to the left of this VMA.
	 * Either between this VMA and vma->vm_prev, or between one of the
	 * VMAs below us in the VMA rbtree and its ->vm_prev. This helps
	 * get_unmapped_area find a free area of the right size.
	 */
	unsigned long rb_subtree_gap;

	/* Second cache line starts here. */

	struct mm_struct *vm_mm;	/* The address space we belong to. */
	pgprot_t vm_page_prot;		/* Access permissions of this VMA. */
	unsigned long vm_flags;		/* Flags, see mm.h. */

	/*
	 * For areas with an address space and backing store,
	 * linkage into the address_space->i_mmap interval tree.
	 */
	struct {
		struct rb_node rb;
		unsigned long rb_subtree_last;
	} shared;

	/*
	 * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma
	 * list, after a COW of one of the file pages.	A MAP_SHARED vma
	 * can only be in the i_mmap tree.  An anonymous MAP_PRIVATE, stack
	 * or brk vma (with NULL file) can only be in an anon_vma list.
	 */
	struct list_head anon_vma_chain; /* Serialized by mmap_sem &
					  * page_table_lock */
	struct anon_vma *anon_vma;	/* Serialized by page_table_lock */

	/* Function pointers to deal with this struct. */
	const struct vm_operations_struct *vm_ops;

	/* Information about our backing store: */
	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE
					   units */
	struct file * vm_file;		/* File we map to (can be NULL). */
	void * vm_private_data;		/* was vm_pte (shared mem) */

#ifndef CONFIG_MMU
	struct vm_region *vm_region;	/* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMA
	struct mempolicy *vm_policy;	/* NUMA policy for the VMA */
#endif
	struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
};

四、vm_operations_struct 结构体完整源码


vm_operations_struct 结构体完整源码 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * These are the virtual MM functions - opening of an area, closing and
 * unmapping it (needed to keep files on disk up-to-date etc), pointer
 * to the functions called when a no-page or a wp-page exception occurs. 
 */
struct vm_operations_struct {
	void (*open)(struct vm_area_struct * area);
	void (*close)(struct vm_area_struct * area);
	int (*mremap)(struct vm_area_struct * area);
	int (*fault)(struct vm_fault *vmf);
	int (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size);
	void (*map_pages)(struct vm_fault *vmf,
			pgoff_t start_pgoff, pgoff_t end_pgoff);

	/* notification that a previously read-only page is about to become
	 * writable, if an error is returned it will cause a SIGBUS */
	int (*page_mkwrite)(struct vm_fault *vmf);

	/* same as page_mkwrite when using VM_PFNMAP|VM_MIXEDMAP */
	int (*pfn_mkwrite)(struct vm_fault *vmf);

	/* called by access_process_vm when get_user_pages() fails, typically
	 * for use by special VMAs that can switch between memory and hardware
	 */
	int (*access)(struct vm_area_struct *vma, unsigned long addr,
		      void *buf, int len, int write);

	/* Called by the /proc/PID/maps code to ask the vma whether it
	 * has a special name.  Returning non-NULL will also cause this
	 * vma to be dumped unconditionally. */
	const char *(*name)(struct vm_area_struct *vma);

#ifdef CONFIG_NUMA
	/*
	 * set_policy() op must add a reference to any non-NULL @new mempolicy
	 * to hold the policy upon return.  Caller should pass NULL @new to
	 * remove a policy and fall back to surrounding context--i.e. do not
	 * install a MPOL_DEFAULT policy, nor the task or system default
	 * mempolicy.
	 */
	int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);

	/*
	 * get_policy() op must add reference [mpol_get()] to any policy at
	 * (vma,addr) marked as MPOL_SHARED.  The shared policy infrastructure
	 * in mm/mempolicy.c will do this automatically.
	 * get_policy() must NOT add a ref if the policy at (vma,addr) is not
	 * marked as MPOL_SHARED. vma policies are protected by the mmap_sem.
	 * If no [shared/vma] mempolicy exists at the addr, get_policy() op
	 * must return NULL--i.e., do not "fallback" to task or system default
	 * policy.
	 */
	struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
					unsigned long addr);
#endif
	/*
	 * Called by vm_normal_page() for special PTEs to find the
	 * page for @addr.  This is useful if the default behavior
	 * (using pte_page()) would not find the correct page.
	 */
	struct page *(*find_special_page)(struct vm_area_struct *vma,
					  unsigned long addr);
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DeepSeek 引发 AI 大模型战火,编程语言群雄激战谁夺胜利权杖?
随着人工智能领域的飞速发展,AI 大模型如璀璨星辰般不断涌现,DeepSeek 作为其中备受瞩目的一员,凭借其强大的性能和广泛的应用潜力吸引了众多关注。在大模型的开发与应用过程中,编程语言的选择起着至关重要的作用。
羑悻的小杀马特.
2025/02/07
1400
4月编程语言排行榜出炉,你用的语言排第几?
Hi,大家好!TIOBE 2024年04月份的编程语言排行榜已经公布,标题显示:PHP 是否正在失去其魔力?
Linux兵工厂
2024/04/15
4530
4月编程语言排行榜出炉,你用的语言排第几?
速度与稳健:Go与Java的编程语言对决
hi,我是程序员王也,一个资深Java开发工程师,平时十分热衷于技术副业变现和各种搞钱项目的程序员~,如果你也是,可以一起交流交流。
王也518
2024/04/17
1.3K0
速度与稳健:Go与Java的编程语言对决
Python在机器学习中的优势与局限性
随着机器学习技术的迅速发展,Python已成为了机器学习领域最受欢迎的编程语言之一。Python以其简单易用、灵活性和丰富的生态系统等优势,在机器学习领域得到了广泛应用。
用户1289394
2024/06/25
2010
Python在机器学习中的优势与局限性
Python简史:开发者的小小副业如何成为全球最热编程语言?
这是针对新型编程语言 Python 举办的第一次 workshop,共有二十来个程序员参加,Barry Warsaw 是其中之一。他记得当时这些第一批用 Python 的人都很兴奋。
CDA数据分析师
2019/08/22
5570
Python简史:开发者的小小副业如何成为全球最热编程语言?
编程语言:Python与Go的深度比较与推荐
推荐文章:开发实践|SpringBoot集成API新宠GraphQL实践-腾讯云开发者社区-腾讯云
china马斯克
2024/11/20
2030
编程语言的大一统:一种跨平台的、多用途的未来编程语言
随着科技的不断进步,编程语言的种类也在日益增多。从早期的C和C++,到后来的Java、Python、Ruby、Go、C#,再到新兴的Rust和Mojo等,每一种语言都有其独特的设计理念和适用场景。然而,随着编程需求的多样化,许多开发者在面对各种语言的选择时感到疲惫。因此,我们不禁畅想,是否有可能出现一种大一统的编程语言,它既能简化学习成本,又能满足不同的应用需求?
DevOps持续交付
2024/04/12
5440
编程语言的大一统:一种跨平台的、多用途的未来编程语言
最新的十大编程语言排名和趋势分析
排名第1,当然非Java莫属了!Java在企业级应用中被广泛使用,并且拥有强大的生态系统。它也被认为是最容易入门的编程语言之一。
35岁程序员那些事
2023/08/18
3.3K0
最新的十大编程语言排名和趋势分析
DeepSeek R1 对编程语言未来的预测
今天分享下 DeepSeek 对于编程语言未来的预测,这个应该也是很多开发者关注的,因为它可能会影响未来的职业选择。
孔令飞
2025/02/26
570
DeepSeek R1 对编程语言未来的预测
如何开发自己的编程语言:从概念到实现
开发自己的编程语言是一项具有挑战性和创造性的任务。这个过程涉及到许多方面,从语言设计到编译器构建都需要深入的理解。在本篇博客中,我将指导你完成这一冒险的旅程。
很酷的站长
2023/12/23
1.2K0
如何开发自己的编程语言:从概念到实现
从零开始搭建创业公司全新技术栈解决方案
大家好,我是猫头虎,今天我们来聊一聊在创业公司中,从零开始搭建一个高效、稳定且可扩展的技术栈。这项任务听起来充满挑战,但也是非常有意义且充满成就感的。无论你是一个技术小白还是资深开发者,本文将带你详细了解从开发语言、组件选择、流程制定到系统化建设的方方面面,逐步搭建一个适合创业公司的全栈技术方案。同时,我们还会探讨如何融入前端技术栈、云原生技术和AI大模型的应用,确保你的技术栈不仅高效而且前沿。
猫头虎
2024/06/21
3100
从零开始搭建创业公司全新技术栈解决方案
如何选择适合自己的编程语言?
哈喽,各位小伙伴!作为一名热爱编程的博主,我深知选择一门适合自己的编程语言对于初学者来说是个大挑战。在这篇博文中,我将带你们深入探索,分享如何选择适合自己的编程语言,让你们在编程的世界中找到属于自己的舞台!😊
默 语
2024/11/20
1530
编程语言大战2024:Python领跑,Java保持稳定,Rust崛起
2024年,Python巩固了其在AI领域的统治地位,Java证明了其在企业领域的持久影响力,而Rust在内存安全编程方面也取得了进展,这标志着全球三大领先编程语言具有变革性的一年。
云云众生s
2024/12/31
1500
Go语言在人工智能时代的崭露头角:为何越来越多公司选择使用Go语言?
当今软件开发领域,Go语言(又称Golang)正逐渐崭露头角,越来越多的公司开始选择使用它作为其主要的编程语言。这一现象不仅仅是一时的潮流,而是基于Go语言独特优势的深思熟虑的决策。本文将从多个角度全面解读为什么越来越多的公司开始使用Go语言,并探讨其背后的原因。
猫头虎
2024/04/08
6290
五种拥有光明发展前景的新兴编程语言
在软件项目与具体实现层面,我们需要考虑众多具体因素。但无论从哪种角度出发,技术栈的选择永远是决定项目成功与否的核心因素之一。根据您的实际应用需求、站点或者产品设计思路,不同的编程语言往往能够带来不同的效果甚至左右项目的最终命运。
Java帮帮
2019/10/28
1.1K0
五种拥有光明发展前景的新兴编程语言
IT圈茶余饭后的“鄙视链” C,C++,Java,Python
在IT领域,除了技术的日新月异,一种特殊的社交现象也在悄然流行,那就是“鄙视链”。这场瞬间的情感大戏,让人仿佛置身于一场刺激的游戏,每个人都觉得自己是鄙视链的最顶端。在这篇博客中,我们将深入挖掘IT圈内C、C++、Java、Python等编程语言之间的鄙视链现象,看看背后的原因和情感纠葛。
人不走空
2024/02/20
4950
IT圈茶余饭后的“鄙视链” C,C++,Java,Python
DEEPSEEK如何回答什么编程语言最适合大气科学
在气象学、气候学等大气科学领域,编程语言的选择通常取决于具体任务(数据处理、模式开发、可视化等)和社区生态。以下是主要语言的优缺点及适用场景:
用户11172986
2025/02/12
1280
DEEPSEEK如何回答什么编程语言最适合大气科学
Lua vs. Python:哪个更适合构建稳定可靠的长期运行爬虫?
网络爬虫在当今信息时代扮演着至关重要的角色,它们能够自动化地抓取互联网上的信息,并且为各种应用提供数据支持。Lua和Python是两种常见的编程语言,它们都被广泛应用于爬虫的开发中。然而,在选择构建长期运行爬虫时,开发者往往会面临一个重要的问题:Lua还是Python更适合?
小白学大数据
2024/05/13
5680
未来发展趋势:哪种主流编程语言将引领潮流?
在当今数字化时代,编程语言的选择对软件开发和科技创新起着至关重要的作用。随着技术的不断演进,不同的编程语言应运而生,其中一些成为了主流。本文将探讨几种主流编程语言,并分析它们未来的发展趋势,以期为开发者和科技爱好者提供一些有益的参考。
很酷的站长
2024/01/01
8990
未来发展趋势:哪种主流编程语言将引领潮流?
IT入门知识第二部分《编程语言》(2/10)
在软件开发的世界里,编程语言是构建应用和系统的基石。选择合适的编程语言对于项目的成功至关重要。本文将深入探讨编程语言的概述、常见的编程语言特性及其在实际开发中的应用,以及在选择编程语言时应考虑的因素。
正在走向自律
2024/12/18
1480
IT入门知识第二部分《编程语言》(2/10)
推荐阅读
相关推荐
DeepSeek 引发 AI 大模型战火,编程语言群雄激战谁夺胜利权杖?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验