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

简单了解一下页表

OS会把物理内存以4KB大小划分成一块一块的,而这划分好的一块就叫做页框或者页帧。为了了解页框的使用情况,比如有多少进程在使用它,是否需要写进磁盘,就需要结构体来对页框进行状态描述,而这个结构体就叫做struct Page,struct page里有一个unsigned int 类型的变量作为位图用来记录页框的状态(每一位都代表页框的一个状态),还存在一个联合体、两个引用计数,其中一个引用计数 _mapcount 就记录了有多少进程在映射它

内核里还存在一个全局数组,就用来存放页框结构体,其对应的数组下标就可以用来映射到物理页框的起始地址(比如下标为2的页框结构体,其物理页框的起始地址就是2*4KB)

同理,还可以通过物理页框的起始地址推出页框结构体在数组的下标,只要除以4KB,结果取整

只需要将任意地址的低12位清零,就可以拿到当前所处页框的起始地址,因为起始地址是4096的整数倍,就是左移12位,所以起始地址的低12位都是零

如果按照直觉,认为页表就是一张表,每一行就是一个条目,分别放虚拟地址、物理地址、对应权限,以32位系统为例,一个地址就占32位,权限位假设为2位,由于存在2的32次方个地址,所以就会有2的32次方行,而一行光是地址就占64位(8字节),整张页表只算地址就得要将近40GB的大小,加上权限位(占4GB),内存是绝对承受不住这么大的内存的,所以页表在底层就不可能是一张表,直觉是错误的

虚拟地址其实是拆成三部分 进行映射的,比如32位机器下,就是以10位、10位、12位进行划分

也就是它其实有三层:

第一层叫做页目录,每一项包含4字节(地址占4字节),包含2的10次方项,第二层叫做页表,每一项占4字节,第三层就是在页表里找到具体物理页框位置后的偏移量

页目录的物理地址通过存在CR3寄存器的页目录基址+虚拟地址前十位(比如是100,就是100*4=400,因为一项占4字节)得到

1、从页目录里得到的地址前20位就是具体页框的起始地址(左移12位就能得到基值),后12位是页框的属性

2、这前20位对应的页框就是要查找的页表,根据虚拟地址的中间10位(跟第一步查找方式一样),找到存放地址,这个地址同样由物理地址+属性构成

3、通过新的物理地址就能找到 数据存放的物理页框的位置,加上后12位(偏移量)就能够直接找到对应的数据

一个页目录能有1024个页表,一个页表能有1024个页表项,就能有1024*1024=1048576个页表项,刚好跟页框数组的大小相等

也就意味着如果虚拟地址高20位一样,就是在一个页框

为什么需要加上中间那层

因为要实现懒加载机制

一个进程地址空间可以有4GB的大小,而页目录分为2的10次方份,平均分下来,每个条目就代表4MB的虚拟地址空间

如果没有中间那一层,页表为了要覆盖到全部虚拟地址,就需要一个4MB大小的页表,不管程序实际所占内存大还是小,都需要有4MB大小的页表

加上中间那一层之后,只需要让页目录所需要的条目指向页表,只要所占数据小于4MB,页表大小就可以只有8KB,就算大于4MB,只要小于8MB,页表大小就可以是12KB,总之比一搞就是4MB的页表要省空间不少

1、一个页表可以有4MB(4KB*1024)虚拟地址大小,加上页目录本身占一个页框,所以一个页表是占4MB+

2、单个进程不可能拥有全部内存,当前进程页表总数会远远小于4MB+

3、懒加载,页表会更少

缺页中断:一旦发现虚拟内存找不到对得上的物理内存,重新做申请内存

写时拷贝:就是给子进程也拷贝一份页目录和对应页表,发生写时拷贝时把实际数据所在的页框拷贝到新的页框,修改要求的内容,再建立新的映射 (fork() 的本质就是复制页表(建立映射),并通过硬件异常来驱动写时复制(COW)。)

操作系统内存在局部性原理(很大可能 会访问当前地址的附近地址)所以磁盘上的数据,才可以提前加载到内存,这样内存才有意义,因此将变量所在4KB进行全部拷贝其实就是用空间换时间

http://www.jsqmd.com/news/449340/

相关文章:

  • 打开软件就弹出d3dx10_37.dll如何修复? 附免费下载方法分享
  • 用Python制作一个文字冒险游戏
  • C++动态链接库开发
  • 代码性能剖析工具
  • PC在线流程图制作工具 中文操作简单高效出图
  • 基于SpringBoot+Vue的海南自贸港智慧服务平台设计与实现
  • 实时音频处理C++实现
  • Git log 自定义输出
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测附Matlab代码
  • 缓存穿透问题及其解决方案
  • 国标GB28181设备端EasyGBD新版本支持采集接入Windows本机Camera和远端RTSP视频流接入到国标GB28181平台
  • ssm基于java的五台山景点购票系统(源码+文档+调试+jsp)
  • 计算机毕业设计:电商数据智能分析预测系统 Django requests爬虫 ARIMA预测 数据可视化 课程设计 毕业设计 大数据 大模型 agent(建议收藏)✅
  • 小杰云商城 V1.0.5 安全加固版发布:把踩过的坑都填平,让你安心运营的电商系统
  • 计算机毕业设计java基于JAVA语言的在线问诊系统 基于B/S架构的在线医疗咨询与挂号服务平台设计与实现 面向患者的在线问诊、电子病历与药品配送一体化系统开发
  • 中间件选型:AI系统如何选择消息队列与缓存?
  • 卡梅德生物解读减肥新靶点曲戈卢单抗(Trevogrumab,靶向肌肉生长抑制素GDF8)
  • 掌握大数据领域 OLAP 数据建模的核心要点
  • nodejs基于vue的运城学院健身房客户关系管理系统vue
  • 河道水域墙体区域垃圾河道要素识别分割数据集labelme格式147张4类别
  • 基于VSG控制的MMC并网逆变器仿真模型附Simulink仿真
  • 模板代码生成工具
  • 企业如何通过智能体解决重复繁琐的问题,需要用哪些工具
  • 微软开源 Agent Lightning 实战教程(非常详细),Agent 训练从入门到精通,收藏这一篇就够了!
  • LangChain 本地部署与 Agent 智能体助手搭建实战详解 - 指南
  • Ubuntu 内网开放 7005 端口实现 SFTP 数据传输
  • 2026年福建、浙江靠谱且售后响应快的橡胶辊制造厂排行榜 - 工业推荐榜
  • 吃透 JVM 核心知识点:概念、内存、类加载、异常一网打尽
  • 深入解析:【Vue3 + ECharts 实战】正确使用 showLoading、resize 与 dispose 避免内存泄漏
  • deep_learning 1