基本概念

将内存切分为等大小的页面,例如一个页位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. Spring 如何解决循环依赖?

    Spring通过三级缓存机制来解决单例Bean的Setter或字段注入类型的循环依赖问题.以下是Spring解决循环依赖的核心流程: 1. 三级缓存介绍 Spring容器为了解决循环依赖,维护了以下三 ...

  2. 什么是 Java 中的 logging write barrier?

    什么是 Java 中的 Logging Write Barrier? Logging Write Barrier 是 Java 垃圾回收器在维护堆引用关系时常用的一种机制.它是一种特殊的写屏障(Wri ...

  3. cocos3 Shader的CCProgram模板详解

    这段内容描述的是一个 着色器(Shader) 的基本结构模板,可能用于一种自定义的着色器语言或框架(例如基于某种图形渲染引擎或中间表示语言扩展的着色器定义方式).以下是逐部分解析其含义: 1. CCP ...

  4. 通达OA前台任意用户登录漏洞+RCE漏洞复现

    声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...

  5. DeepWiki:AI驱动、免费且实用的 GitHub 源码阅读与分析神器!

    前言 GitHub 作为全球最大的代码托管平台,汇聚了无数开发者的智慧结晶,为各行各业的技术进步提供了宝贵的资源.然而,面对浩瀚如海的代码库,如何高效地阅读.理解和分析源码,成为了摆在众多开发者面前的 ...

  6. 【BERT】详解BERT

    一.为什么要提出BERT? 传统的RNN类模型,包括LSTM,GRU以及其他各种变体,最大的问题在于提取能力不足.在<Why Self-Attention? A Targeted Evaluat ...

  7. Typora+PicGo+OSS搭建博客图床

    Typora+PicGo+OSS搭建博客图床 Q:为什么需要搭建博客图床呢? A:首先,博客园平台支持markdown语法进行创作 其次,最近想在微信公众号同步文章,在思考有没有多平台快捷发布的办法, ...

  8. Polarctf -- Re(1)

    Polarctf之简单逆向 1. shell 用exeinfope查看下程序结构, 发现存在upx壳 用upx工具脱壳, upx.exe -d shell.exe 再使用IDAPro打开 #flag{ ...

  9. WPF Thumb 滑块控件踩坑

    最近在做一个仿 手机选择时间的控件,如下图,选用了 Thumb 滑块控件做上下滑动的功能.订阅了 Thumb_OnDragStarted.Thumb_DragDelta和Thumb_DragCompl ...

  10. Kali Linux 从入门到实战:系统详解与工具指南

    Kali Linux 从入门到实战:系统详解与工具指南 1. Kali Linux 简介 Kali Linux 是一款基于 Debian 的 Linux 发行版,专为 渗透测试 和 网络安全审计 设计 ...