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.hqwc.cn/news/691254.html

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

相关文章

人工智能能否解决科学问题:Wolfram的视角

引言 在当今AI技术飞速发展的背景下,它在科学研究领域的应用正逐渐深入。从AlphaFold 3的推出到日益复杂的计算模型,AI似乎在向科学家的角色靠拢。然而,美国计算机科学家Stephen Wolfram在一系列讲座和文章中提出了反思:AI真的能…

DDD架构理论详解

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

Python-VBA函数之旅-str函数

目录 一、str函数的常见应用场景 二、str函数使用注意事项 三、如何用好str函数? 1、str函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、str函数的常…

Uniapp 自定义弹窗

布局 <view><view v-if"show" class"popup"><view class"popup-box"><view>支付方式:{{way}}</view><view>停车费用:{{money}}</view><view class"btn-box"><view class"ca…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前&#xff0c;首先要划分出二维码的区域&#xff0c;在本篇文章中将从零开始实现二维码分割的功能&#xff0c;并详细介绍用到的方法。 我们需要处理的图像如下&#xff1a; 完整代码 首先我们先放出完整代码&#xff0c;然后根据整个分割流程介绍用到…

ESP32-C3-MINI-1

https://www.espressif.com.cn/sites/default/files/documentation/esp32-c3-mini-1_datasheet_cn.pdf 芯片 https://files.seeedstudio.com/wiki/XIAO_WiFi/Resources/esp32-c3_datasheet.pdf 结果参考&#xff1a; https://blog.csdn.net/iamxxdd/article/details/12386419…

6818Linux内核--Bootloader应用分析

Bootloader应用分析 一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a; 引导加载程序。包括固化在固件( firmware )中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。 Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 文件系统…

npm无法安装node-sass 的问题

安装 node-sass 的问题呈现&#xff1a;4.9.0版本无法下载 Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-…

Xilinx FPGA底层逻辑资源简介(1):关于LC,CLB,SLICE,LUT,FF的概念

LC&#xff1a;Logic Cell 逻辑单元 Logic Cell是Xilinx定义的一种标准&#xff0c;用于定义不同系列器件的大小。对于7系列芯片&#xff0c;通常在名字中就已经体现了LC的大小&#xff0c;在UG474中原话为&#xff1a; 对于7a75t芯片&#xff0c;LC的大小为75K&#xff0c;6输…

【NTN 卫星通信】参考卫星集成场景和架构

1 卫星接入场景 1.1 同一PLMN内的卫星和地面接入网 一个PLMN可以同时具有地面3GPP接入和卫星3GPP接入。在此场景中&#xff0c;单独的N2实例处理单独的访问类型节点。然而&#xff0c;卫星接入网的覆盖范围可以跨越地面接入网的覆盖范围。 图1 同PLMN架构下的卫星和地面3GPP接…

Linux修炼之路之基础指令(2)+shell命令及运行原理

目录 一&#xff1a;基础指令 7.rm指令 和 rmdir指令 8.*通配符 9.man指令 10.echo指令 11.cat 指令 12.cp 指令 13.mv指令 14.alias 指令 15.less more head tail wc-l 指令 16.date 时间相关的指令 17.cal指令 18. find which whereis 三个查找文件指令…

JAVAMAP和Set相关习题8

1.字符串中第一个只出现一次字符 class Solution {public int firstUniqChar(String s) {int[] countnew int[26];for(int i0;i<s.length();i){char chs.charAt(i);count[ch-a];}for(int i0;i<s.length();i){char chs.charAt(i);if(count[ch-a]1){return i;}}return -1;…