内核解读之内存管理(6)address_space建立文件索引结点inode和页page、虚拟地址空间vma的映射

news2024/11/13 12:10:48

内存管理和文件系统总会交织在一起,所以我们今天聊的内容和文件系统有关。

上一节的struct page结构体中,我们看到了一个成员struct address_space*。很明显是用于建立page和address_space的关联。

它是代表某个地址空间吗?实际上不是的,它是用于建立文件结点(struct inode)到内存页面(struct page)的映射,其实就是每个file都有这么一个结构,将文件系统中这个file对应的数据与这个file对应的内存绑定到一起;

与之对应,address_space_operations 就是用来操作该文件映射到内存的页面,比如把内存中的修改写回文件、从文件中读入数据到页面缓冲等。

file结构体和inode结构体中都有一个address_space结构体指针,实际上,file->f_mapping是从对应inode->i_mapping而来,inode->i_mapping->a_ops是由对应的文件系统类型在生成这个inode时赋予的。inode用于唯一地表征磁盘上的一个文件,而file可以共享同一个inode,例如硬链接便是如此,所以inode才是文件的根。

备注:关于什么是inode可以看文件系统分析章节。

下面这张图展示了文件和内存的映射体系:
在这里插入图片描述

struct address_space {
	struct inode		*host;
	struct xarray		i_pages;
	struct rw_semaphore	invalidate_lock;
	gfp_t			gfp_mask;
	atomic_t		i_mmap_writable;
#ifdef CONFIG_READ_ONLY_THP_FOR_FS
	/* number of thp, only for non-shmem files */
	atomic_t		nr_thps;
#endif
	struct rb_root_cached	i_mmap;
	unsigned long		nrpages;
	pgoff_t			writeback_index;
	const struct address_space_operations *a_ops;
	unsigned long		flags;
	struct rw_semaphore	i_mmap_rwsem;
	errseq_t		wb_err;
	spinlock_t		private_lock;
	struct list_head	private_list;
	void			*private_data;
} __attribute__((aligned(sizeof(long)))) __randomize_layout;
  • host指针指向该address_space所属的inode

  • i_pages管理了该文件所映射的page

xarray是一种高效的基数树数据结构,用于管理大量的索引项。它在Linux内核中被广泛用于管理页面、文件索引等场景。

xarray的设计目标是提供高效的查找和操作性能,并且具有较低的内存开销。它通过将索引项组织成一棵基数树(Radix Tree)来实现这些目标。基数树是一种多叉树,每个节点的子节点数量可以根据需要动态增长。

在struct address_space结构体中,i_pages成员使用了xarray,用于管理地址空间中页面的索引。页面可以根据其页号作为索引项插入到xarray中,这样就可以快速地进行页面的查找、插入和删除操作。通过xarray,可以有效地管理大量页面,并且能够提供高性能的访问和操作。

  • struct rb_root_cached i_mmap; 管理文件所映射的虚拟地址空间vma。

mmap.c:

static int vma_link(struct mm_struct *mm, struct vm_area_struct *vma)
{
	VMA_ITERATOR(vmi, mm, 0);
	struct address_space *mapping = NULL;

	vma_iter_config(&vmi, vma->vm_start, vma->vm_end);
	if (vma_iter_prealloc(&vmi, vma))
		return -ENOMEM;

	vma_start_write(vma);

	vma_iter_store(&vmi, vma);

	if (vma->vm_file) {
		mapping = vma->vm_file->f_mapping;
		i_mmap_lock_write(mapping);
		__vma_link_file(vma, mapping);
		i_mmap_unlock_write(mapping);
	}

	mm->map_count++;
	validate_mm(mm);
	return 0;
}
static void __vma_link_file(struct vm_area_struct *vma,
			    struct address_space *mapping)
{
	if (vma_is_shared_maywrite(vma))
		mapping_allow_writable(mapping);

	flush_dcache_mmap_lock(mapping);
	vma_interval_tree_insert(vma, &mapping->i_mmap);
	flush_dcache_mmap_unlock(mapping);
}

vm_area_struct 用于描述进程的一段虚拟地址空间。

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

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

相关文章

华为OD机试真题-执行时长-2023年OD统一考试(C卷)---Python3-开源

题目: 考察内容: if for math.ceil()向上取整 代码: """ 题目分析:输入: int 1次最多执行的任务个数 int 数组长度 list 任务数组--表示任务个数 输出: 执行完所有任务最小时间 eg: 3…

C语言-指针详解速成

1.指针是什么 C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存,以及进行复杂的数据操作。在C语言中&#…

【Java程序设计】【C00288】基于Springboot的篮球竞赛预约平台(有论文)

基于Springboot的篮球竞赛预约平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的篮球竞赛预约平台 本系统分为前台功能模块、管理员功能模块以及用户功能模块。 前台功能模块:用户进入到平台首页&a…

CSDN付费阅读需要哪些条件?

文章目录 前言一、博客等级要求二、原力等级要求结束语 前言 hello,大家好!我是BoBo仔吖,祝大家元宵节快乐呀~ csdn是一个善良的网站,它提供了各种功能空间,比如InsCode运行代码,还有鼓舞大家努力发文的勋…

全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.4.0)

TableGo_20240224 v8.4.0 正式版发布,此次版本累计更新如下: 1、TableGo专属LOGO上线 2、生成数据库文档ER图新增备注字段名的生成配置 3、生成自定义文件功能新增临时参数配置,用于使用临时数据生成自定义文件 4、新增基于Excel数据生成…

【算法与数据结构】127、LeetCode单词接龙

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:示例1为例,hit到达cog的路线不止一条,如何找到最短是关键。广度优先搜索是一圈…

汪峰哭晕在厕所-《实现领域驱动设计》中译本评点-第2章(1)

相关链接 DDD领域驱动设计批评文集>> 《实现领域驱动设计》的翻译错误>> [答疑]《实现领域驱动设计》的译者其实没错?(一)>> [答疑]《实现领域驱动设计》的译者其实没错?(二)>> 十多年前&#xff0…

设计一个 shell 命令行程序

目录 实现 shell 主要思路 代码(Linux)系统 实现 shell 主要思路 1、要知道一个 shell 进程在运行起来都会在命令行呈现什么,如图是Xshell 登录成功后的界面:所以第一步要做的就是打印命令行提示符。 Xshell 命令行提示符的组…

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_003---人工智能工作笔记0098

前面的环境安装差不多了,这里我没有安装git,因为我认为用不到,好下面去下载算法: 首先是算法下载: https://codeload.github.com/THUDM/ChatGLM-6B/zip/refs/heads/main 算法的下载连接是这里: 可以看到下载以后得到这个ChatGLM-6B-main这个算法压缩包 然后我们再去: 然后…

Linux配置Maven环境变量

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

探究全链路压力测试的含义与重要性

全链路压力测试是指对整个应用系统的各个环节或组件进行压力测试,以模拟实际生产环境中的用户负载和流量,评估系统在高负载条件下的性能表现。 1. 全链路压力测试的含义 全链路压力测试涉及系统的所有组件和环节,包括前端用户界面、应用服务器…

Java多线程并发学习

一、Java 中用到的线程调度 1. 抢占式调度: 抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长&#xff0…

智胜未来,新时代IT技术人风口攻略-第七版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像角色先行结论 - 市场下的增量蛋糕高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一…

神经网络系列---计算图基本原理

文章目录 计算图符号微分符号微分的步骤示例符号微分在计算图中的使用总结 数值微分前向差分法中心差分法数值微分的使用注意事项总结 自动微分1. 基本原理2. 主要类型3. 计算图4. 应用5. 工具和库6. 优点和缺点 计算图1. **计算图的建立**2. **前向传播**3. **反向传播**4. **…

IT廉连看——C语言——循环语句

IT廉连看——C语言——循环语句 循环语句分为三种: while for do while 一、while循环 我们已经掌握了,if语句: if(条件)语句; 当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次…

调度和管制机制

目录 1 调度机制 分组按优先级排队 公平排队 FQ (Fair Queuing) 加权公平排队 WFQ (Weighted Fair Queuing) WFQ 与 FIFO 的比较 2 管制机制 漏桶管制器 (leaky bucket policer) 3 漏桶机制与加权公平排队相结合 调度和管制机制是使互联网能够提供服务质量的重要措施。…

K线实战分析系列之三:吞没形态

K线实战分析系列之三:吞没形态 一、吞没形态二、看涨吞没形态三、看跌吞没形态四、吞没形态判别标准 一、吞没形态 两根或两根以上的K线形成的组合形态,吞没形态就是一种主要的反转形态。 这个形态由两根K线组成,前短后长,一阴一…

软考-中级-系统集成2023年综合知识(三)

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 软考中级专栏回顾 专栏…

Raspbian命令行RTSP/RTP服务

Raspbian命令行RTSP/RTP服务 1. 源由2. Raspbian摄像头2.1 命令行启动RTP摄像头2.2 命令行启动RTSP摄像头 3. 示例3.1 测试RTP摄像头3.2 测试RTSP摄像头3.3 QGroundControl测试3.3.1 RTSP配置3.3.2 RTP配置 4. 总结5. 参考资料 1. 源由 鉴于实际测试发现RTP协议下,…

K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…