【Linux】页表的深入分析

上一篇文章介绍了线程的基本概念

而本篇文章我们来深入理解一下, CPU再调度我们以往理解的进程和如今的线程都会涉及到的一个内容: 页表


文章目录

  • 深入理解页表 *
    • 页表的实际组成*
      • 什么是page?

深入理解页表 *

在介绍进程时, 博主没有深入介绍过页表.

只是简单说了 页表是进程地址空间和物理内存之间的相互映射. 而且, 画图也对页表做了简单化处理:

但是实际上, 页表并不是只有简单的两栏, 页表的实现是有些复杂的, 不是一张表可以描述的.

不过 整个结构抽象一下暂时还是可以以一级页表来表示:

页表可以看作, 除了有虚拟地址或物理地址两栏之外, 其实还有其他栏:名中、RWX权限、U/K权限

这三个栏中, 最简单理解的是两个权限:

  1. RWX权限, 即为读、写、执行三权限, 表示进程对物理内存的访问权限

我们知道C/C++中, 常量数据是不能做修改的. 其实, 原因就是页表对进程做出了限制.

实际上物理内存(硬件)是不具备访问控制的, 谁都可以读写.

实际情况是我们并不能随意读写, 这是由于软件的限制.

以我们的视角来看, 程序的代码和部分数据是无法被修改的. 但是这些代码和数据又可以被加载到内存中.

其实就是因为 物理内存本身是不具备访问控制的, 我们看到的不可被修改是通过软件来限制的.

  1. U/K权限, 其实是User/Kernel权限, 即表示用户和内核. 这里就可以区分访问内存的用户权限和内核权限

除了这两个权限之外, 还有一栏 是 是否命中

是否命中这一栏是什么意思呢?

当CPU需要访问指定内存的数据的时候, 会用虚拟地址通过页表向物理内存中查询数据.

但是, 程序的数据并不是一下子全部加载到物理内存中的, 即 页表中可能不存在指定的物理内存. 所以CPU需要访问数据的时候, 可能存在第一次找不到的情况. 这种情况我们称为 没有命中.

当CPU访问数据没有命中时, 整个进程会从CPU上拉下来先不运行, 然后操作系统会将未命中的数据从磁盘程序中加载到指定的物理内存中, 然后CPU才会再运行此进程.

所以, 是否命中这一栏其实是 表示此次CPU访问数据是否在物理内存中找到了.

这种进程数据不一次性加载到物理内存的机制, 是因为进程地址空间的存在才存在的.

可以允许进程在使用指定数据或代码的时候才将代码和数据真正加载到物理内存中. 这样可以更有效地利用内存资源

先以一级页表介绍了CPU从虚拟地址到物理内存查询数据的机制.

下面来介绍一下, 操作系统中 页表究竟是以什么形式存在的.

页表的实际组成*

我们以32位环境(进程地址空间和物理内存最大都为4GB)为例:

如果使用一级页表(即只使用一张页表), 想要将虚拟地址和物理地址意义对应, 那么页表需要多少行条目?

如果 页表的一行只表示一个地址, 那么32位 就是 2^32 个地址. 页表中的一行并不只存储一个地址(32位环境, 地址的大小为4字节). 至少有两个, 那么我们按最少来假设一行条目大小是8字节.

那么要存储着 2^32 个地址, 页表至少需要多大?

2^32 * 8 = 34,359,738,368, 单位是字节. 一共是32GB. 而我们32位环境下的物理内存最大才4GB.

很明显, 以一级页表来将虚拟内存对应的物理内存全部映射到, 是不切合实际的.

那么, 页表实际在操作系统中是以什么形式存在的呢?

其实 操作系统中的页表是多级页表. 在 32位系统中, 采用两级页表的形式.


在正式分析介绍页表的实际构成之前, 还需要补充一部分内容.

在32位环境下, 物理内存最大为4GB. 虚拟地址空间也是4GB.

那么CPU在访问数据时, 提供的虚拟地址也就是32位的.

因为CPU 需要有能力提供 能覆盖所有物理内存的地址, 32位环境下, 就是32位二进制

CPU给页表提供的虚拟地址是32位的, 但是 却并不是直接将32位作为一个整体在页表中查找物理地址的.

而是 将 32位二进制 分为了 10 + 10 + 12 的形式.

// CPU提供的32位二进制地址
// 会分为10、10、12位的三部分来进行查找
0000 0000 00  0000 0000 00  0000 0000 0000
xxxx xxxx xx  yyyy yyyy yy  zzzz zzzz zzzz

CPU会分别用这三部分查找到物理内存.


为什么CPU会以这样的形式查找物理内存呢?

其实主要是因为页表是这样设计的.

32位环境下, 页表映射的实现使用的是二级页表, 情况如下:

首先使用虚拟地址的最高10位, 在页目录中找到一个相应的页表

然后再在找到的页表中, 找到page的起始地址.

什么是page?

在介绍Linux文件系统时, 提到过一个概念:操作系统的I/O操作的基本单位通常是4KB.

这是因为通常磁盘的物理块大小一般是4KB. 操作系统将I/O操作的基本单位通常设置为 与磁盘的物理块大小一致

既然操作系统将I/O操作的基本单位设置为了4KB, 那么其实操作系统也会将内存以4KB为基本单位来进行管理.

操作系统会将物理内存以4KB为基本单位, 并将其称为页或页框(page)来进行管理.

即, 在操作系统中 物理内存被划分为了若干个4KB的单位, 被称为页框.

物理内存被分为若干4KB大小的页框 |wide

除了物理内存之外, 磁盘中的程序在编译的时候, 也是按照4KB为单位划分好的. 程序中的4KB单位被称为页帧

那么操作系统通过程序中的地址区域进一步生成的进程地址空间, 其实也会按照4KB为单位划分.

page在Linux内核源代码中是以一个结构体维护的:

page 结构体

那么, 4GB的内存可以划分为多少page呢?

4GB的内存是 4 * 1024 * 1024 * 1024 字节, 4KB 则是 4 * 1024 字节.

即, 最终操作系统中会存在 1024*1024 个page.

操作系统会**将这些page统一以一个数据结构维护起来**, 最终对内存的管理 其实就可以看作对此数据结构的管理

这里通过二级页表找到的page的起始地址, 其实是一个真实的物理内存, 找到的就是物理内存中的一页page

但是, 找到page做什么用呢?我们虚拟地址中的最低12位也没有用到, 怎么能够找到指定的物理地址呢?

其实, 虚拟地址的最低12位起到了一个偏移量的作用, 我们称虚拟地址的最后12位为 页内偏移量

我们可以**找到 page的起始地址, 在将虚拟地址的最低12位作为偏移量, 就能够找到一个准确的物理地址**.

不过, 这个条件是 虚拟地址的12位可以全覆盖一个page的大小. 这个条件成立吗?

成立.

page的大小是4KB, 即 4 * 1024 = 4 * 2^10 = 2^2 * 2^10 = 2^12

虚拟地址的最低12位刚好可以覆盖到page的全部地址.

这样 先后通过虚拟地址的最高10位, 虚拟地址的中间10位 和 虚拟地址的最低12位, 就可以找到指定的物理地址

然后就可以读取物理内存中的数据.

用一张图表示整个流程就是:

CPU通过页表用虚拟地址查找物理地址的过程

那么介绍到这里, 其实针对页表中是否名中这一栏目, 就可以有一个更加具体的理解了.

即, 二级页表中 应该记录指定page的位置, 存储的是null. 出现此情况时, 也就说明了程序的数据并没有加载到某page中, CPU此次查找也就无法找到指定的物理地址, 此时就是未命中. 也就是说, CPU查找物理内存, 其实只关心page是否存在, 不关心内容. 并且, 资源也是以page为单位加载到内存中的.

这也是 页表设计的第一个优点: 进程虚拟地址管理与物理内存管理之间, 通过页表和page做了解耦. 即, 进程虚拟地址与物理内存之间不存在实际具体数据的关联, 从虚拟地址找物理地址只能做到判断物理地址、数据是否存在, 而不会有数值耦合的情况.

第二个优点就是, 更加节省内存. 如果只使用一张一级页表, 这张页表要在一开始就创建好, 并且4GB的内存需要一一对应, 那么占用内存太大 不合实际.
而如果是像这样的多级页表, 页目录的大小最大也就KB量级. 并且 由于使用二级页表, 第一级和第二级是可以分离的, 那么第二级页表的分配其实也可以按需创建、按需分配. 需要第二级页表的时候再创建, 不需要的时候不用创建. 这样就可以大大的节省内存, 最多最多也就是MB量级了.

第三个优点就是, 方便管理. 从页目录这张第一级页表, 去找指定的第二级页表, 这个结构其实就像是一颗多叉树. 第二级页表就可以像树的节点一样, 按需创建、删除、管理等.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

展心展力 metaapp:基于 DeepRec 的稀疏模型训练实践

作者 metaapp-推荐广告研发部:臧若舟,朱越,司灵通 1 背景 推荐场景大模型在国内的使用很早,早在 10 年前甚至更早,百度已经用上了自研的大规模分布式的 parameter server 系统结合上游自研的 worker 来实现 TB 级别…

“三箭齐发”,诸葛智能三大产品全新升级,助力企业迈向数字化经营 | 爱分析调研

调研:文鸿伟 撰写:文鸿伟 诸葛智能,是容联云旗下敏捷开放的场景化数据智能服务商,累积服务全国1000企业,覆盖泛互联网、泛电商、金融、汽车、产业科技、企服等数十个垂直领域。 自2015年成立至今,诸葛智…

数据库管理-第六十五期 Oracle 23c新特性(20230411)

数据库管理 2023-04-11第六十五期 Oracle 23c新特性1 免费版23c目录结构2 新特性总结第六十五期 Oracle 23c新特性 上一期装了免费版23c,这一期根据安装的数据库,对Oracle 23c的部分新特性进行实验展示。 1 免费版23c目录结构 通过RPM包安装的免费版2…

背包问题-动态规划

背包问题 容量有限的背包&#xff0c;给很多商品&#xff0c;商品有相应的体积与价值 01背包问题 一个背包 每个物品只有一个 最终状态方程 dp[i][j]max(dp[i-1][j],dp[i-1][j-w[i]]v[i]) 推导过程 由上一层推导过来 选择拿不拿i 最终代码 #include<iostream> #…

前段时间面了10多个人,发现这些测试人都有个通病......

前段时间面了15个人&#xff0c;怎么说呢&#xff0c;基本上没有符合要求的&#xff0c;其实一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3年工作经验&am…

GitHub标星15w,如何用Python实现所有算法?

学会了 Python 基础知识&#xff0c;想进阶一下&#xff0c;那就来点算法吧&#xff01;毕竟编程语言只是工具&#xff0c;结构算法才是灵魂。 新手如何入门 Python 算法&#xff1f; 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xf…

数据 数据元素 数据项 数据对象

文章目录数据、数据元素、数据项和数据对象数据数据元素数据对象数据元素和数据对象数据结构数据结构包括以下三个方面的内容逻辑结构物理结构&#xff08;存储结构&#xff09;逻辑结构与存储结构的关系逻辑结构的种类集合结构线性结构树型结构图状结构或网状结构四种基本的存…

webgl-根据鼠标点击而移动

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用3. 结语转发自CSDN远程穿透的文章&#xff1a;【群晖…

[C语言]string.h常用字符串库函数详解+模拟实现

目录 字符串函数 strlen strcpy strcat strcmp strstr 内存函数 memcpy memmove 人生百态&#xff0c;苦事之多。烦恼穿心&#xff0c;何来解脱&#xff1f;打开博客&#xff0c;吸取干货。 以码消愁&#xff0c;以串解忧。泱泱年轮&#xff0c;唯有生活。一起撸串&a…

〖Python网络爬虫实战⑩〗- 正则表达式实战(一)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

2023 年男生还推荐报计算机专业吗?

计算机专业确实是一个非常热门的专业&#xff0c;就业前景也很广阔。 但是&#xff0c;近些年随着各个大学对计算机专业及其相关专业疯狂扩招&#xff0c;而且每年的毕业人口都在增多&#xff0c;行业是根本容纳不下的&#xff0c;就业竞争力度也急剧上升。因此&#xff0c;选…

Mac平台上有哪些好用的常用软件?

我大概分几类给你介绍一下吧。 一、办公类 1.微软的office系列&#xff0c;在mac平台也有office的全家桶&#xff0c;习惯用微软office的也可以安装。 2.wps office&#xff0c;wps可以说是国产最好用的office软件&#xff0c;最重要的是wps可以跨平台&#xff0c;并且云文档…

IT审计黄金标准“CISA”备考经验分享-529分成功上岸

激动的心&#xff0c;先晒下成绩单 考证建议以及职业规划 对于IT人士来说证书是一个非常有效的敲门砖&#xff0c;尤其是想跨到新的领域&#xff0c;一个证书往往能给自己在面试官留下一个深刻的印象&#xff0c;尤其是一些在专业领域含金量很高的证书。作为一个14年的IT人士&…

81-82-83-84-85-86 - 文件系统设计与实现

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;深入浅出操作系统 - 目录 文章目录1. 问题1.1 硬盘上最最最简单的文件系统支持方式1.2 改进思路1.3 更多细节问题1.4 文件系统概要设计1.5 硬盘数据逻辑示意图1.6 硬盘数据物理组…

​2023年十大目标检测模型!

“目标检测是计算机视觉中最令人兴奋和具有挑战性的问题之一&#xff0c;深度学习已经成为解决该问题的强大工具。”—Dr. Liang-Chieh Chen目标检测是计算机视觉中的基础任务&#xff0c;它涉及在图像中识别和定位目标。深度学习已经革新了目标检测&#xff0c;使得在图像和视…

微服务架构-服务网关(Gateway)-路由功能详解

路由功能详解 这一节我们看一看Gateway中的路由是怎么工作的&#xff1b;GateWay网关的路由功能可不是简简单单的 “转发" 请求&#xff0c;在请求到达网关要流转到指定服务之间发生了很多事儿&#xff0c;它不光可以拒绝请求&#xff0c;甚至可以"篡改” 请求的参数…

Java 在线编程编译工具上线,直接运行Java代码

前言 大家好&#xff0c;我是小哈~ 周末没出去浪&#xff0c;花了点时间&#xff0c;在我的个人网站上线了一款小工具。啥工具呢&#xff1f;一款可以在线编译 Java 代码并运行输出结果的小工具。 大家都知道&#xff0c;甲骨文刷 Java 版本号非常积极&#xff0c;这不上个月…

web综合

一&#xff0c;基于域名访问www.openlab.com 在文件当中写入IP与域名的映射关系 在windows中写入 也可以在客户端的/etc/hosts下写入映射关系 创建目录 [rootserver ~]# mkdir -pv /www/openlab 将所需要的内容写入对应目录当中 [rootserver ~]# echo welcome to openlab ! &…

大一被忽悠进了培训班

大家好&#xff0c;我是帅地。 最近我的知识星球开始营业&#xff0c;不少大一大二的小伙伴也是纷纷加入了星球&#xff0c;并且咨询的问题也是五花八门&#xff0c;反正就是&#xff0c;各种迷茫&#xff0c;其中有一个学弟&#xff0c;才大一&#xff0c;就报考培训班&#…