页面大小、页表项、虚拟地址和物理地址之间的关系(转)
From:https://www.cnblogs.com/0Nullptr/articles/6958964.html
一、首先明确几个概念
逻辑地址:是程序编译后,生成的目标模块进行编址时都是从0号单元开始编址,称之为目标模块的相对地址,即为逻辑地址。
页:将进程划分的块,对应的大小就叫页面大小。
页框:将内存划分的块。
页和页框二者一一对应,一个页放入一个页框,(理论上)页的大小和页框的大小相等。
页表:就是一个页和页框一一对应的关系表。【存放在内存中】 关系表只是起到一个索引的作用,说白了就是能根据关系表能查到某一个页面和哪一个页框所对应。
二、用例子说话【例子出现在:《王道考研操作系统》的内存管理部分】
已知条件:逻辑地址32位、页面大小4KB、页表项大小4B,按字节编址。
分析:
1.
首先32位的虚拟地址可表示的进程大小应该是2^32B = 4GB(暂时别去想页号P占多少位,W占多少位)
2.(根据页的定义和页面大小的定义)将进程进行分页:
3.我们已经知道了页面的数目为:2^20页。现在的迷茫点就在于页表项的问题上。
上图在页表上已经给出了几个数据:20位,12位,32位,2^20项。一一解释如下【请结合上图一个一个数据分析】:
2^20项:因为页表的作用是要将页面的页框一一对应起来,所以,每一个页面在页表中都应该有一个页表项:用来表示一个页号对应一页页框号(内存中的块号),故应
该有2^20项。【不应该有问题吧,就好像一个班有50个同学,每个人都应该有一个地址一样】
20位:已经很显然了,需要表示出2^20个页表项,就至少需要20位的地址。为什么只取20位而不是21位,22位呢,本人现在还没想这个问题,就暂时定为恰好取20位即可。
32位:已知条件里告诉了页表项大小为4B,那么自然就应该是32位了。
12位:32位-20位 = 12位。为什么页框号地址为12位,只能表示2^12个页框,要小于2^20个页面呢,因为并不是进程的每一个页面都要调入内存。其实32位、12位、20位这三个数据还是有一定依据的,在二级分页的时候就会发现“哦,原来刚刚好”。此处暂不讨论二级分页。
4.通过上面的分析我们得出了哪些数据:
逻辑地址32位,进程大小:4GB。
页面:大小4KB,数量:2^20页。
页表项:4B,数量:2^20项。所以页表就需要4B*2^20 = 4MB的空间存储(这就是书中说:页表项大小为4MB的由来)进一步,主存的页框大小和页面大小是相等的,也为4KB,所以将页表存在主存就需要占用4MB/4KB = 1024页(因为页表也是存在主存中的,而主存也是按页框划分的。这的确是一种资源浪费,所以就需要建立二级页面,将其大小控制在1页之内,将二级页面存入主存即可)
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2019-04-02 我是管理员