当前位置: 首页 > news >正文

【Linux】重谈页表寻址|深入理解物理内存和页表的映射|页框|CPU|CR3|MMU

目录

​编辑

前言

页框 

页表 

​编辑 寻址过程


 

前言

每个进程都有自己的内存地址空间,该空间其实都是虚拟地址,要借助页表来映射到实际物理内存地址中。而真实的页表是如何的呢?

之前介绍过OS和磁盘文件进行IO的基本单位是4kb = 八个扇区;而OS对内存的管理工作基本单位也是4kb;

OS进程内存管理,不是以字节为单位,而是以内存卡为单位,默认大小是4kb;

页框 

页框(Page Frame):

        是物理内存中的固定大小的块,通常为4KB。在物理内存中,页框是用于存储实际数据的最小单元。假设内存大小为4GB,也就能划分出1024*1024个页框。当进程通过页表来访问物理地址时,其本质就是找到页框的地址。 

操作系统对于物理内存的管理变成了对页框块的管理;一个页框是什么呢?❓

在Linux内核中,使用struct page结构来描述内存中的每一页框。这个结构体定义在内核头文件include/linux/mm_types.h中。该结构体通常有以下字段:flags:标志位,表示页面的各种状态;

  • mapping:指向该页框所属的地址空间
  • index:该页框在地址空间中的偏移量
  • _maocount:记录该页框到页表条目数
  • _refcount:页面引用计数。表示有多少用户正在使用该页框
struct page {void *address;          // 物理地址unsigned long flags;    // 页面标志(例如是否在使用、是否脏等)struct page *next;      // 指向下一个页面的指针(可能用于链表)unsigned int usage;     // 页面使用计数unsigned int refcount;  // 引用计数unsigned int type;      // 页面类型unsigned int index;     // 页面索引
};

页表 

页表是用于存储物理内存与虚拟内存地址之间的映射关系的结构。每个进程都有属于自己的页表。页表是由页目录和页表项组成的。

每个虚拟地址都是 32个比特位,即 0000 0000 0000 0000 0000 0000 0000 0000;

        前面10个比特位存储的是页目录;

        中间10是二级页表;

        最后剩下的12个比特位作为偏移量(对应着二级页表指向页框起始地址处后进行偏移)

寻址如下:

  • 虚拟地址的前10个比特位在页目录当中进行查找,找到对应的页表(页目录用于索引相应的页表),2^10字节 = 1KB,存储页目录所需的内存是 1KB,且页目录只有一张;
  • 再选择虚拟地址中间的10个比特位在对应的页表当中进行查找,找到物理内存中对应页框的起始地址,每张页表的大小也是 2^10字节 = 1KB,页表是有多张的;
  • 最后将虚拟地址中剩下的12个比特位作为偏移量从对应页框的起始地址处向后进行偏移,找到物理内存中某一个对应的字节数据,2^12字节 = 4KB,与物理内存的页框对应

 寻址过程

MMU 接收到一个虚拟地址。

这个虚拟地址被分成三个部分:页目录索引、页表索引和页内偏移量。

MMU 使用 CR3 中的值找到页目录表的物理地址,通过页目录索引查找页目录表中的对应项,得到指向页表的物理地址,使用页表索引查找页表中的对应项,得到指向页框的物理起始地址,将页框的物理地址与页内偏移量组合,形成最终的物理地址。

实现了虚拟内存到物理内存的有效转换。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大数据技术——实战项目:广告数仓(第四部分)
  • 2024半年度盘点 | 全球重大勒索软件攻击事件(非常详细)零基础入门到精通,收藏这一篇就够了
  • ISP代理与双ISP代理的区别
  • 【Kubernetes】Service 概念与实战
  • React 中 useEffect 语法详解
  • 人工智能在子宫内膜癌领域的研究进展|顶刊速递·24-08-12
  • QT移除窗体的最大化和最小化按钮
  • Unity Audio
  • 实验25.创建文件
  • linux中信号的相关概念
  • 利用QT和FFmpeg实现一个简单的视频播放器
  • android视频播放,(一)MediaPlayer视频播放示例
  • 微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1
  • Docker的卸载|安装|启动|停止|重启
  • vue防止鼠标左键拖动选中页面的元素
  • #Java异常处理
  • 11111111
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  •  D - 粉碎叛乱F - 其他起义
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Facebook AccountKit 接入的坑点
  • in typeof instanceof ===这些运算符有什么作用
  • javascript 总结(常用工具类的封装)
  • JavaScript异步流程控制的前世今生
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Lsb图片隐写
  • opencv python Meanshift 和 Camshift
  • 官方解决所有 npm 全局安装权限问题
  • 聊聊sentinel的DegradeSlot
  • 思否第一天
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​Spring Boot 分片上传文件
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #pragma data_seg 共享数据区(转)
  • (1)bark-ml
  • (13)DroneCAN 适配器节点(一)
  • (175)FPGA门控时钟技术
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (C语言)球球大作战
  • (k8s中)docker netty OOM问题记录
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)u-boot-nand.bin的下载
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)fock函数详解
  • (转)树状数组
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .chm格式文件如何阅读
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net core 6.0 升8.0
  • .NET Core 版本不支持的问题
  • .net core 源码_ASP.NET Core之Identity源码学习