Linux-页(page)和页表

本文在页表方面参考了这篇博客,特别鸣谢!

【Linux】页表的深入分析

1. 页帧和页框

        页帧(page frame)是内存的最小可分配单元,也开始称作页框,Linux下页帧的大小为4KB。

        内核需要将他们用于所有的内存需求,例如有些页帧需要将物理内存映射到用户模式进程的虚拟地址空间。为了有效管理这些操作,就需要区分当前使用的页帧和空闲的可用页帧。通过数据结构struct page来实现

         缺页中断:OS通过页表寻址时,发现目标内容不在物理内存中

        页表有标记位,通过标记位来判断,而且这时页表填的是文件在磁盘中的地址(可以理解为LBA地址)

缺页中断处理流程:

  1. 申请内存
  2. 在磁盘中找到目标内容的地址
  3. 把内容加载到内存指定的位置
  4. 重新填充页表
  5. 返回用户,终止异常

        在CPU中有两个寄存器CR2和CR3,CR3用于指向页表目录,CR2保存引起缺页异常或中断的地址


2. 页表

        进程虚拟地址访问操作,都需要页表从虚拟地址转换为物理地址,页表提供虚拟地址到物理地址的映射关系

        接下来都是以32位来举例

        有没有思考过这样一个问题,页表也是数据,需要保存在内存中,它需要占用多少内存呢?

        假如一个页表,一行也被称为页表项,需要保存两个地址就按照32位下两个指针也就是8字节,还有一些标志位用来判断页表映射的情况,合在一块算个整数10字节。虚拟地址空间一共有2^32个地址就要2^32*10字节,这么算下来就要40GB,一个页表就要这么多空间,是不是很夸张,而且每个进程都要一个页表,内存仅仅用来保存一个页表都远远不够,那操作系统的页表是怎么样的呢?

        地址有32位,被分为三段,前两段分为两个10位,最后12位,最后12位刚好对应4*2^10,

每一位对应一个字节的话,刚好是4KB

        页表采用多级页表连续映射,一级页表也被称为页表目录,负责地址空间前10位的映射关系,相当于把4GB的空间,分成每4MB为一个单元,作为搜索的单位;一级页表的页表项指向二级页表,进行更加细粒度的地址映射,负责中间10位的映射关系,把4MB空间,分成每4KB为一个单元,这样二级页表就可以搜索定位到对应的页框,指向对应页框的起始地址

        最后在通过虚拟地址的后12位,也就是页框的偏移量找到对应的物理地址,刚好4KB

        为什么虚拟地址的后12位,就是页框的偏移量呢?

        除了物理内存之外, 磁盘中的程序在编译的时候, 也是按照4KB为单位划分好的,那么操作系统通过程序中的地址区域进一步生成的进程地址空间, 其实也会按照4KB为单位划分。

        只能说一切都不是巧合,都是操作系统安排好的,围绕page页为标准

页表设计的优点:

  • 进程虚拟地址管理与物理地址管理之间,通过页表和page完成了解耦
  • 更加节省内存
  • 方便管理

解耦: 进程虚拟地址与物理内存之间不存在实际具体数据的关联, 从虚拟地址找物理地址只能做到判断物理地址、数据是否存在, 而不会有数值耦合的情况

节省空间:页表目录KB级别大小,二级页表也就MB级别的,和之前的计算数据相比大大减少了,而且一级页表和二级页表分离,二级页表就可以按需创建和分配

方便管理:从页目录这张第一级页表, 去找指定的第二级页表, 这个结构其实就像是一颗多叉树. 第二级页表就可以像树的节点一样, 按需创建、删除、管理等


3. vm_area_struct

        通过之前的学习,我们知道mm_struct中包含很多的字段用于规划虚拟内存空间的堆栈等待的起始地址和结束地址

mm_struct 部分代码如下:

struct mm_struct
{/*...*/struct vm_area_struct *mmap;		/* list of VMAs */struct rb_root mm_rb;u64 vmacache_seqnum;                /* per-thread vmacache */unsigned long mmap_base;	/*映射基地址*/unsigned long mmap_legacy_base;	/*不是很明白这里*/unsigned long task_size;	/*该进程能够vma使用空间大小*/unsigned long highest_vm_end;	/*该进程能够使用的vma结束地址*/pgd_t * pgd;atomic_t mm_users;atomic_t mm_count;int map_count;			/* vma的总个数 */unsigned long total_vm;	   /* 映射的总页面数*//*...*/unsigned long start_code, end_code, start_data, end_data;unsigned long start_brk, brk, start_stack; /* 堆栈起始地址和结束地址 */unsigned long arg_start, arg_end, env_start, env_end; /* 环境变量和参数的起始和结束地址 *//*...*/

         但是这些都是对虚拟地址空间大致做的区域划分,如果空间不是连续所有的,例如堆的空间申请就是一块一块的不连续,这时光光上面的区域划分就不够细致,所以就有了接下来的vm_area_struct结构体,用来做空间资源的细粒度划分,描述虚拟地址空间中的线性内存区域(连续空间)

vm_area_struct 代码如下:

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;    //所属的 mm_structpgprot_t vm_page_prot;      unsigned long vm_flags;     //标志位struct {struct rb_node rb;unsigned long rb_subtree_last;} shared;	struct list_head anon_vma_chain;struct anon_vma *anon_vma;const struct vm_operations_struct *vm_ops;  //vma对应的实际操作unsigned long vm_pgoff;     //文件映射偏移量struct file * vm_file;      //映射的文件void * vm_private_data;     //私有数据atomic_long_t swap_readahead_info;
#ifndef CONFIG_MMUstruct vm_region *vm_region;	/* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMAstruct mempolicy *vm_policy;	/* NUMA policy for the VMA */
#endifstruct vm_userfaultfd_ctx vm_userfaultfd_ctx;
} __randomize_layout;

        其中包含vm_start和vm_end分别表示资源的起始地址和结束地址,其结构是双链表。

完。

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

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

相关文章

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量,用于设置账号密码,我设置的账号和密码都是 minioadmin export MI…

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

[蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define INF …

PyCharm 集成 Git

目录 1、配置 Git 忽略文件 2、定位Git 3、使用pycharm本地提交 3.1、初始化本地库 3.2、添加到暂存区 3.3、提交到本地库 3.4、切换版本 4、分支操作 4.1、创建分支 4.2、切换分支 4.3、合并分支 5、解决冲突 1、配置 Git 忽略文件 作用&#xff1a;与项目的实际…

问题:幂等性 分布式session

web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成&#xff0c;举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页&#xff0c;现在在toTrade请求中使用异步任务编排Completab…

Linux下安装mysql8.0(以tar.xz包安装--编译安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以tar.xz包安装--编译安装&#xff09;https://myweb.myskillstree.cn/126.html 目录 一、下载对应自己glic版本的MySQL …

1.基于python的单细胞数据预处理-降维可视化

目录 降维的背景PCAt-sneUMAP检查质量控制中的指标 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 降维的背景 虽然特征选择已经减少了维数&#xff0c;但为了可视化&#xff0…

C++语法|智能指针的实现及智能指针的浅拷贝问题、auto_ptr、scoped_ptr、unique_ptr、shared_ptr和weak_ptr详细解读

文章目录 1.自己实现智能指针智能指针引起的浅拷贝问题尝试定义自己的拷贝构造函数解决浅拷贝 2.不带引用计数的智能指针auto_ptrscoped_ptrunique_ptr&#xff08;推荐&#xff09; 3.带引用计数的智能指针模拟实现引用计数shared_ptr和weak_ptr循环引用&#xff08;交叉引用&…

DDD架构理论详解

文章目录 一、概念入门1. 概念简介2. DDD的核心理念3. 范式4. 模型5. 框架6. 方法论7. 软件设计的主要活动 二、DDD核心理论1. Domain领域层都包含什么&#xff1f;2. 聚合、实体和值对象3. 仓储&#xff0c;封装持久化数据4. 适配&#xff08;端口&#xff09;&#xff0c;调用…

AI应用案例:新闻文本分类

随着科学技术的不断发展&#xff0c;互联网技术得以快速的发展和普及&#xff0c;并已在各行各业得到了广泛的应用&#xff0c;从中致使了网络上的信息呈现出爆炸式的增长状态&#xff0c;达到了“足不出户&#xff0c;万事皆知”的境况&#xff0c;充分体现了互联网新闻给生活…

Java实现自定义注解,实现不需要token 验证就可以访问接口

目录 1 问题2 实现 1 问题 一个springboot 项目&#xff0c;需要token 验证&#xff0c;前端传过来token ,我们一般在项目全局写一个过滤器&#xff0c;去验证前端传过来的token ,如果有哪些接口不需要token验证&#xff0c;那么就排除这些接口&#xff0c;这个也需要配置。 …

前端 | TED打卡号分类查询

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 提供完整TED打卡号对应TED标题的查询列表 根据分类按需查询 &#x1f4da;模块实现解析 &#x1f407;html 搭框架<div cl…

Android Studio连接MySQL8.0

【序言】 移动平台这个课程要做一个app的课设&#xff0c;我打算后期增加功能改成毕设&#xff0c;就想要使用MySQL来作为数据库&#xff0c;相对于SQLlite来说&#xff0c;我更熟悉MySQL一点。 【遇到的问题】 一直无法连接上数据库&#xff0c;开始的时候查了很多资料&#…

海外云手机解决海外社交媒体运营难题

随着全球数字化浪潮的推进&#xff0c;海外社交媒体已成为外贸企业拓展市场、提升品牌影响力的重要阵地。Tiktok、Facebook、领英、twitter等平台以其庞大的用户基础和高度互动性&#xff0c;为企业提供了前所未有的营销机会。本文将介绍如何通过海外云手机&#xff0c;高效、快…

eNSP中小型园区网络拓扑搭建(下)

→b站直通车&#xff0c;感谢大佬← →eNSP中小型园区网络拓扑搭建&#xff08;上&#xff09;← 不带配置命令的拓扑图已上传~ 配置ospf SW5 # ospf 1 router-id 5.5.5.5area 0.0.0.0network 192.168.51.5 0.0.0.0network 192.168.52.5 0.0.0.0area 0.0.0.10network 192.1…

elk + filebeat 8.4.3 收集nginx日志(docker部署)

ELK filebeat docker部署 一、 elasticsearch部署1、运行elasticsearch临时配置容器2、拷贝文件目录到本地3、检查elasticsearch.yml4、删除之前elastic&#xff0c;运行正式容器5、docker logs记录启动日志 二、部署kibana1、运行kibana临时配置容器2、docker拷贝配置文件到本…

数据链路层——计算机网络学习笔记三

使用点对点信道的数据链路层 前言&#xff1a; 1.数据链路层的重要性&#xff1a;网络中的主机、路由器都必须实现数据连输层&#xff1b; 2.数据链路层中使用的信道&#xff1a; 点对点信道&#xff1a;这种信道是一对一的通信方式&#xff1b; 广播信道&#xff1a;使用一对多…

硬盘架构原理及其算法RAID工作原理写惩罚

一、硬盘的架构以及寻址原理 硬盘工作原理&#xff1a; 硬盘寻址原理&#xff1a;逻辑顺序磁道、盘片、扇区&#xff08;顺序CHS&#xff09; 二、机械硬盘算法 读取算法 寻道算法 个人与企业适合的算法和寻道 个人使用的机械硬盘适合的寻道算法和读取算法是&#xff1a…

WPS表格:使用vlookup函数解决乱序数据对应问题

我们常常会遇到两个表格的内容相同&#xff0c;但是顺序不一致的情况。并且这种顺序无关于简单的排序&#xff0c;而是一种业务性很强的复杂排序规则。下面我举个例子&#xff0c;使用VLOOKUP复制数据。 假设太阳系行星举办了一次卖萌比赛&#xff0c;由太阳妈妈决定谁是最萌的…

ElasticSearch 8.X 源码导入idea并配置环境启动调试(mac环境)

主要是用于自己记录配置流程 环境 IntelliJ IDEA 2024.1.1 (Community Edition) jdk17&#xff08;可以安装jenv管理&#xff09; macos 14.4.1 gradle 8.5 资源准备 先在官网下载elasticsearch源码&#xff08;GitHub - elastic/elasticsearch: Free and Open, Distrib…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件&#xff0c;用于共享和编辑地理空间数据。它支持多种地理空间数据格式&#xff0c;并且可以发布为多种服务格式&#xff0c;如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS)&#xff0c;以及…