基本概念

将内存切分为等大小的页面,例如一个页位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. leetcode每日一题:酿造药水需要的最少总时间

    引言 ​ 今天的每日一题原题是2255. 统计是给定字符串前缀的字符串数目,直接模拟,逐个匹配words中的字符串是否是s的前缀即可.更换成前几天遇到的更有意思的一题来写这个每日一题. 题目 给你两个 ...

  2. 关于TFDMemtable的使用场景

    TFDMemtable是FireDAC框架的内存数据集组件.也是处理数据最快速的组件.简单说是把数据快储在内存中进行处理,因此其数据是和数据源是隔离的. 使用场景: 1.把一些少量的经常会使用的数据放 ...

  3. HTB打靶记录-Administrator

    # 信息收集 nmap -sV -sC -O 10.10.11.42 Nmap scan report for 10.10.11.42 Host is up (0.70s latency). Not ...

  4. RocketMQ的Consumer是如何消费消息的

    Rocketmq提供了两种主要的消费模式:推送式消费(Push Consumer)和 拉取式消费(Pull Consumer) 一.Consumer消费消息的基本流程 1.实例化Consumer:创建 ...

  5. 🎀spring @conditional介绍及使用

    简介 @Conditional 是 Spring 框架中用于条件化注册 Bean的核心注解,它允许开发者根据特定条件决定是否将某个Bean注册到 Spring 容器中.这一机制在实现多环境配置.模块化 ...

  6. 康谋分享 | AD/ADAS的性能概览:在AD/ADAS的开发与验证中“大海捞针”!

    如果您希望从数百万小时的驾驶数据中查找特定的相关驾驶事件和未遂事故,以确保您的所需功能正确运行,最好的方法就是创建一个系统性能的概览分析,实现在数据日志中快速检索关注点.为此,康谋在本文将为您详细介绍 ...

  7. Linux系统中的软件管理

    简介 Linux 系统中的软件管理体系主要包括软件包管理工具.软件仓库以及相关的依赖管理等方面.以下是详细介绍: 软件包管理工具 dpkg:Debian 及其衍生系统(如 Ubuntu)使用的底层软件 ...

  8. 备注一下,SolidColorBrush,自定义颜色

    new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27212B"))

  9. 【记录】smartctl|Linux如何通过smartctl查看有没有坏的磁盘?以及使用时长、电源周期、故障记录等

      smartctl是一个用于监测和分析硬盘健康状态的工具,可以用于检测是否存在坏的磁盘.以下是使用smartctl检查磁盘健康状态的步骤: 安装smartctl软件 在Linux系统中,smartc ...

  10. Flutter制作桌面图标长按展示操作项面板

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...