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

Linux内存管理的分页机制

分段机制的原理如下:

分段机制下的虚拟地址由两部分组成,段选择子段内偏移量。段选择子就保存在段寄存器里面。段选择子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。虚拟地址中的段内偏移量应该位于 0 和段界限之间。如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

将上面的虚拟空间分成以下 4 个段,用 0~3 来编号。每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示。

如果要访问段 2 中偏移量 600 的虚拟地址,我们可以计算出物理地址为,段 2 基地址 2000 + 偏移量 600 = 2600。

在 Linux 里面,段表全称段描述符表(segment descriptors),放在全局描述符表 GDT(Global Descriptor Table)里面,会有下面的宏来初始化段描述符表里面的表项。

#define GDT_ENTRY_INIT(flags, base, limit) { { { \.a = ((limit) & 0xffff) | (((base) & 0xffff) << 16), \.b = (((base) & 0xff0000) >> 16) | (((flags) & 0xf0ff) << 8) | \((limit) & 0xf0000) | ((base) & 0xff000000), \} } }

一个段表项由段基地址 base、段界限 limit,还有一些标识符组成。

其实 Linux 倾向于另外一种从虚拟地址到物理地址的转换方式,称为分页(Paging)。

对于物理内存,操作系统把它分成一块一块大小相同的页,这样更方便管理,例如有的内存页面长时间不用了,可以暂时写到硬盘上,称为换出。一旦需要的时候,再加载进来,叫做换入。这样可以扩大可用物理内存的大小,提高物理内存的利用率。

这个换入和换出都是以页为单位的。页面的大小一般为 4KB。为了能够定位和访问每个页,需要有个页表,保存每个页的起始地址,再加上在页内的偏移量,组成线性地址,就能对于内存中的每个位置进行访问了。

虚拟地址分为两部分,页号页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址。这个基地址与页内偏移的组合就形成了物理内存地址。

当然对于 64 位的系统,两级肯定不够了,就变成了四级目录,分别是全局页目录项 PGD(Page Global Directory)、上层页目录项 PUD(Page Upper Directory)、中间页目录项 PMD(Page Middle Directory)和页表项 PTE(Page Table Entry)。

此文章为11月Day1学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

http://www.lryc.cn/news/213734.html

相关文章:

  • Unity DOTS系列之托管/非托管Component的区别与性能分析
  • elementui el-upload 上传文件
  • Python图像处理【15】基于非锐化掩码锐化图像
  • 介绍几款Linux 下终极SSH客户端
  • 项目综合实训,vrrp+bfd,以及策略路由的应用
  • [架构之路-246/创业之路-77]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 客户关系管理系统CRM
  • python manage.py createsuperuser运行错误
  • 解决恶意IP地址攻击:保卫网络安全的有效方法
  • Android WMS——WMS窗口添加(十)
  • CVPR 2023 | 主干网络FasterNet 核心解读 代码分析
  • 【进阶C语言】数组笔试题解析
  • vue-router学习(四) --- 动态添加路由
  • 科东软件受邀参加2023国家工业软件大会,共话工业软件未来
  • ros启动节点的launch文件你真的会写吗?
  • AMEYA360:循序积累立体布局,北京君正实景展示AI-ISP
  • 10.31 知识总结(选择器、css属性相关)
  • 【网络协议】聊聊TCP如何做到可靠传输的
  • 记一次flask框架环境综合渗透测试
  • 博弈论学习笔记(2)——完全信息静态博弈
  • 【COMP304 LEC4 LEC5】
  • 表白墙(服务器)
  • 在 Mac 中卸载 Node.js
  • Hafnium构建选项及FVP模型调用
  • 第44天:前端及html、Http协议
  • shell_63.Linux产生信号
  • 互联网摸鱼日报(2023-11-01)
  • AR的光学原理?
  • 语义分割 实例分割的异同点
  • C++学习初探---‘C++面向对象‘-继承函数重载与运算符重载
  • Linux下搭建SRS服务器环境