基本概念

将内存切分为等大小的页面,例如一个页位4096 B = \(2^{12}\) B,也就是4 KB。这样,内存的最小单位变成了4 KB。

4 GB (\(2^{32}\) B) 的内存地址范围为:0x 0000 0000 ~ 0x FFFF FFFF

4 KB 的内存范围为:0x 0000 0000 ~ 0x 0000 0FFF

也就是说,如果要变成以4 KB为一页来管理内存,地址就变成了

0x FFFF F000 ~ 0x FFFF FFFFF

.

.

.

.

0x 0000 2000 ~ 0x 0000 2FFF

0x 0000 1000 ~ 0x 0000 1FFF

0x 0000 0000 ~ 0x 0000 0FFF

这样的排布,也就是说,4 GB被分为 \(2^{32-12} = 2^{20}\) 个大小为4 KB的块。

这样,地址的高20位,对应着16进制地址的高5位,就代表了分页地址。找一个地方把这高20位保存起来,再加上12位的页属性,就变成了一个4个字节大小的,页表项或者叫做分页入口。

页表 Page Table | 分页

页地址高20位+页属性 | 0x FFFF F000 ~ 0x FFFF FFFFF

. | .

. | .

. | .

. | .

页地址高20位+页属性 | 0x 0000 2000 ~ 0x 0000 2FFF

页地址高20位+页属性 | 0x 0000 1000 ~ 0x 0000 1FFF

页地址高20位+页属性 | 0x 0000 0000 ~ 0x 0000 0FFF

左边的页表,总共\(2^{20}\)个页表项,一个页表项是4 个字节,也就是 \(2^{2+20} = 2^{22}\) = 4 MB的大小,即页表大小是4 MB就可以管理整个4 GB大小的所有内存空间。

这个4 MB的页表也同样用4 KB的分页来管理,\(\frac{4MB}{4KB}=\frac{2^{22}}{2^{12}}=2^{10}=1024\) ,所以总共4MB的页表也被划分为了1024个分页。

一个分页中,有\(\frac{4KB}{4}=\frac{2^{12}}{2^2}=1024\) 个页表项。

这1024个页表,放在内存中,不是专门有一个区域的,也就是可能完全杂乱随机,不按照顺序存放的。因此,我们需要一个页表目录,去存放记录页表项的入口都在哪里。

仍然是使用4个字节来存放页表入口(4个字节:页表地址高20位+页表属性),因为我们是32位的系统,总共1024个页表项,那就是\(2^{12}\)=4KB大小的页表目录,刚好是一个分页的大小。其实这都是严格设计的,保证了数据结构的4K对齐。

使用专门的寄存器CR3,来保存页目录的起始地址。

之前有说过,为了简化内存的管理,会使用平坦内存模型。也就是每个段都是4GB,每个段的起始地址都是0x 0000 00000。因此,每个段的区别是读写访问权限的不同。

分页地址计算

加上了今天的内存分页之后,物理地址的计算就变成:

逻辑地址(段选择子+偏移地址) --分段机制找到段基地址--> 线性地址(虚拟地址)(段基地址+偏移地址) --分页机制--> 物理地址

每个32位的线性地址被划分为三个部分:页目录索引(10位),页表索引(10位):偏移(12位即4K)。

首先根据分段机制,计算出来了线性地址。依据下面的步骤进行地址转换:

1、 装入进程的页目录地址(操作系统在调度进程时,把这个地址装入CR3寄存器),CR3中的值是预先存储好的。

2、 根据现行线性地址的前10位,在页目录中找对应的索引项,页目录中的项是一个页表的地址。

3、 根据线性地址的中间10位,在页表中找到页的起始地址。

4、 将页的起始地址与线性地址的最后12位相加,得到物理地址。

这样的二级模式是可以覆盖4G的物理地址空间的。

64位时代

CPU进入了64位时代之后,分段机制逐渐被弱化。但是,为了保证兼容性,没有被抛弃,段机制也无法完全关闭,而是通过将所有的段基址全部都当作0,而且忽略段选择子中的段界限的大小。

![[Pasted image 20250705153329.png]]

段寄存器中的DS/ES/SS被直接忽略,而FS/GS/CS只关注其中的几位,也就是一部分属性的大小。

![[Pasted image 20250705153455.png]]

这样,就进入了平坦模式。只需要关注Paging的几种方法

![[Pasted image 20250705153529.png]]

【x86】内存页式管理的更多相关文章

  1. c模拟 页式管理页面置换算法之FIFO

    写的操作系统作业.... 放上来给需要的小伙伴 需要注意的地方: 1.该算法只涉及单进程 2.只是用c模拟FIFO的思想 FIFO思想:选择在内存中存活时间最久的页面淘汰 关于该算法我的理解: 一个进 ...

  2. Linux段式管理与页式管理

    内存管理有2种机制:1.段式管理:2.页式管理 在80386CPU中增加了2个寄存器:1.全局性的段描述表寄存器GDTR 2.局部性的段描述表寄存器LDTR 段寄存器的高13位用于在全局或局部描述表项 ...

  3. 【转帖】linux内存管理原理深入理解段式页式

    linux内存管理原理深入理解段式页式 https://blog.csdn.net/h674174380/article/details/75453750 其实一直没弄明白 linux 到底是 段页式 ...

  4. linux内核源码——内存管理:段页式内存及swap

    os的内存管理大概可以分成两块:1.段页式管理(虚存)2.swap in 和 swap out 段页式管理 段式管理的图像:运行时重定位 多级页表的管理图像  块表加速 用户(程序员)希望用段,物理内 ...

  5. x86-3-段式管理(segmentation)

    x86-3-段式管理(segmentation) 3.1 段式管理概述: 从8086CPU开始,为了让程序在内存中能自由浮动而又不影响它的正常执行,CPU将内存划分成逻辑上的段来给程序使用. x86继 ...

  6. x86-7-页式管理(Paging)

    x86-7-页式管理(Paging) 页式管理是重中之重! 在段式管理下操作系统的运作出现了很多问题,因为段的长度不定,在分配内存时,可能会发生内存中的空闲区域小于要加载的段,或者空闲区域远远大于要加 ...

  7. [转载]linux段页式内存管理技术

    原始博客地址: http://blog.csdn.net/qq_26626709/article/details/52742470 一.概述 1.虚拟地址空间 内存是通过指针寻址的,因而CPU的字长决 ...

  8. 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)

    分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...

  9. 操作系统之cache、伙伴系统、内存碎片、段式页式存储管理

    存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...

  10. 转://Linux大内存页Oracle数据库优化

    PC Server发展到今天,在性能方面有着长足的进步.64位的CPU在数年前都已经进入到寻常的家用PC之中,更别说是更高端的PC Server:在Intel和AMD两大处理器巨头的努力下,x86 C ...

随机推荐

  1. restful 服务器一个问题,看ChatGPT的威力

    看看是否牛逼: 真不是写代码的料,也没有这样的天赋,仅仅玩玩而已. 问题:客户端边缘路由中一段js代码,使用get请求一个方法,把json数据送入数据库相关表.由于种种原因导致长连接,通过资源管理器可 ...

  2. 活动中台系统慢 SQL 治理实践

    作者:vivo 互联网服务器团队- Zhang Mengtao 活动中台系统作为中台项目非常注重系统性能和用户体验,数据库系统性能问题会对应用程序的性能和用户体验产生负面影响.慢查询可能导致应用程序响 ...

  3. 最火的 Python 异步 Web 框架的综合对比分析

    以下是当前最火的 Python 异步 Web 框架的综合对比分析,涵盖性能.技术特性和适用场景,并补充其他值得关注的框架: 一.主流异步框架横向对比 1. FastAPI • 核心优势:基于 Star ...

  4. SpringSecurity5(13-核心组件和认证流程)

    SecurityContextHolder SecurityContextHolder 持有的是安全上下文的信息,当前操作的用户是谁,用户是否已经被认证,他拥有哪些角色权限等,这些都被保存在 Secu ...

  5. arthas安装和简单使用

    介绍 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参.异常,监测方法执 ...

  6. fiddler的composer设计器

    1.过程:点击composer,把要修改请求体的会话拖到composer空白处,composer出现请求方式,url,请求报文,请求体 2.在请求体中修改请求内容(比如删除号码),然后点击excute ...

  7. 经典常用SQL查询语句和常见问题

    一.基础 1.常用sql: ------------------------ // mysql改root密码 mysqladmin -u用户名 -p旧密码 password 新密码 # ---more ...

  8. configfs-用户空间控制的内核对象配置

    1. 什么是configfs? configfs 是一个基于内存的文件系统,它提供了与sysfs相反的功能.sysfs 是一个基于文件系统的内核对象视图,而configfs 是一个基于文件系统的内核对 ...

  9. vue3 基础-API-案例-ToDoList

    前面几篇我们介绍了 compostion API 的一些基础用法, 如 setup, ref, reactive, toRefs, toRef, context 等. 本篇呢找了一个经典的 TodoL ...

  10. ASP.NET Core之由配置系统与创建app所想到的

    先看文件配置的代码: ConfigurationBuilder configBuilder=new ConfigurationBuiler();//典型的创建者模式 configBuilder.Add ...