Linux-页(page)和页表

news2024/11/15 17:37:32

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

【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_struct
	pgprot_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_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;
} __randomize_layout;

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

完。

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

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

相关文章

【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 合并小型项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现 在项目的初始阶段,往往需要针对重要的设计决策和技术实现原型实验。当原型评估结束后,需要将那些成功的原型合并起来称为整个项目的初始版本。 在这样的情景中,各个原…

什么是ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案

在数字化日益深入的今天,网络安全问题愈发凸显其重要性。其中,ARP攻击作为一种常见的网络攻击方式之一,往往给企业和个人用户带来不小的困扰。ARP协议是TCP/IP协议族中的一个重要协议,负责把网络层(IP层)的IP地址解析为数据链路层…

Vmvare—windows中打不开摄像头

1、检查本地摄像头是否能正常打开 设备管理器—查看—显示隐藏设备—选中照相机—启动 USB2.0 HD UVC—打开相机查看 2、检查虚拟机的设置 虚拟机—虚拟机—可移动设备—USB2.0 HD UVC—勾选在状态栏中显示 虚拟机—打开windows主机—右小角选中圆圈图标—勾选连接主机 此时…

办公园区建筑科技风效果(html+threejs)

办公楼科技风(Htmlthreejs) 初始化三维场景 function init() {container document.getElementById(container);camera new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 150000000);camera.position.set(550, 600, 690);scene new THREE.Sce…

MES系统追溯管理功能,迅速定位问题源头

一、MES系统概述 MES系统是一种实现车间生产智能化、信息化的管理系统,通过对生产现场的数据进行实时采集、处理和分析,为企业管理者提供准确、及时的生产信息。MES系统主要包括生产订单管理、物料追溯、质量管理、设备管理、物料管理、人员管理等功能模…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考: 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

Python送你小花花

快到520了,准备好送上你的爱意了吗? 还记得去年从网上模仿了一篇python使用turtle画的小花花程序,当时还没有转行到程序员行业,刚刚入门学习编程,还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

uniapp如何打包预约按摩H5?

uniapp如何打包预约按摩H5? 开发工具:HBuilderX 一、如何修改域名配置? 1、修改公众号AppID、页面访问路径 1)gzh_appid: 公众号AppID siteroot: 域名,需更换为你自己的域名以及公众号APPID,域名格式【htt…

雍禾植发张东宏:以诚相待毛发患者

医学道路上的奋斗往往需要坚定的信念和不懈的努力。对于张东宏医生来说,医学并非止步于书本知识,而是一次次与患者对话、一次次实操中的历练和积累。在他的成长历程中,医学之路如同一棵参天大树,每一步都是扎实的打磨,…

windows设置Redis服务后台自启动

问题 在日常开发过程中,redis是我们常用的缓存工具,但是由于redis对于Linux系统进行开发的,在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢&#xff0c…

Arduino红外遥控器,控制继电器水泵

我们将讨论如何使用Arduino和IRremote库来实现通过红外遥控器控制继电器的开关。通过这个项目,你将学会如何接收和解码红外信号,并根据接收到的信号控制继电器(这里的继电器可以换成其他传感器)的状态。 项目简介 我们将使用Ard…

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想,没有不辛苦的工作,5年经验后端开发程序员,已经从事自由职业1年半,今天就来客观分享一下自由职业的利与弊。 时间自由,减少中间商赚差价 自由职业最让人羡慕的就…

探秘Web3科技:科技变革的下一个风口

引言 随着互联网的发展,我们正处于一个数字化时代,而Web3技术被认为是数字革命的下一个风口。相较于传统的Web2,Web3技术以其去中心化、安全可信的特点,正在引领着科技变革的潮流。本文将深入探讨Web3科技,揭示其背后…

泽攸科技无掩模光刻机:引领微纳制造新纪元

在当今科技迅猛发展的时代,微纳制造技术正变得越来越重要。泽攸科技作为这一领域的先行者,推出了其创新的无掩模光刻机,这一设备在微电子制造、微纳加工、MEMS、LED、生物芯片等多个高科技领域展现出了其独特的价值和广泛的应用前景。 技术革…

C#实现各种Hash计算

C#实现各种Hash计算 文章目录 C#实现各种Hash计算涉及框架及库目前支持可计算的类型核心代码完整可运行代码 BCrypt总结 涉及框架及库 自己在NuGet管理器里面安装即可 BouncyCastle.Cryptography:是加密算法和协议的.NET实现。 目前支持可计算的类型 BLAKE2B_16…

Laravel中使用MinIO进行文件操作及ZIP解压

Laravel中使用MinIO进行文件操作及ZIP解压指南 介绍 在本指南中,我们将详细介绍如何在laravel框架中操作minio,包含方法有:桶列表,创建桶,修改桶,上传文件,删除文件,生成直传链接&…

【全开源】JAVA语聊大厅语音聊天APP系统源码

语聊大厅语音聊天源码:打造专属的语音社交平台 核心功能 多人语音聊天:支持多人同时在线语音聊天,用户可以创建或加入不同的聊天室,与好友或陌生人进行实时互动。语音转文字:提供语音转文字功能,方便用户…

Folder Icons for Mac v1.9激活版:自定义文件夹图标

在追求个性和品味的今天,Folder Icons for Mac 让您的Mac桌面焕然一新。支持多种格式的图片和图标文件,满足您不同的审美需求。同时,软件提供丰富的图标库和模板,让您在定制文件夹图标时更加得心应手。Folder Icons for Mac 不仅能…

react 图片没有加载出来的问题

react 图片没有加载出来的问题 我原来是这样写的 <Layout><Sider><imgsrc"../images/login/topdivbg20221202.png"/></Sider><Content><Menu onClick{onClick} selectedKeys{[current]} mode"horizontal" it…