逻辑地址 线性地址 物理地址 Linux kernel 内存管理设计

news2024/11/19 23:39:55

 linux kernel 2.6以后的MM,受到了兼容 risc arch cpu 的 MM 的启发,新的 MM 架构对 x86 上任务切换的效率上也有明显提高。

新的MM架构,GDT 不再随着进程的创建与结束而创建和删除 新的表项。

TSS段 也只有一个,进程切换时,只修改其中的一些bit的信息,TSS的 SS0, esp0,io bitmap 即可。

1,机器解析的思路

发现网络上大量的教程,多是以讹传讹地讲解 Linux 内存管理;

都是在讲:

逻辑地址  ->  线性地址  ->  物理地址

如果谙熟 Linux 制定的GPT和编译原理或对二进制分析比较熟练的话,会发现线性地址的值,因为段选择子指向的段描述符中的基地址(内核数据段、代码段和用户数据段、代码段)设置为0x00000000,因此在不同进程之间会比较接近 ,或者说是类似的一套,即Linux 进程中的 逻辑地址就是线性地址。

线性地址 = 段基地址 + 逻辑地址偏移 = 0x00000000 + 逻辑地址偏移 = 逻辑地址

但,基于此,不同的进程,却能解析出完全不同的物理地址,这个转换关系是怎么发生的。

上面这个过程确实是程序运行时地址的翻译顺序;

但是,程序之所以按照这个顺序来解析地址,是因为前期有人类中的一些大脑袋巧妙地按照相反到方向

物理地址  ->  线性地址  ->   逻辑地址

设计了这个内存管理系统;

2,人类设计mm的思路


在x86架构中,页表(Page Table)和页目录(Page Directory)是用于虚拟内存管理的重要数据结构。x86架构使用两级页表结构,包括页目录、页表和物理页框。

页目录(Page Directory)是一个包含1024个32位项的数组,每个项指向一个页表。页表(Page Table)是一个包含1024个32位项的数组,每个项指向一个物理页框。

x86架构中的虚拟地址被分为三部分:10位页目录索引、10位页表索引和12位页内偏移。通过这三部分可以定位到物理内存中的具体位置。

页表和页目录的规划方法通常包括以下步骤:

1. 页表初始化:

        在操作系统启动时,会初始化页表和页目录,建立虚拟地址到物理地址的映射关系。

2. 页表项填充:

        将页表和页目录中的项填充为合适的值,包括物理页框的地址和权限信息。

3. 页表更新:

        在进程切换或内存分配时,需要更新页表和页目录中的项,以反映新的虚拟地址到物理地址的映射关系。

4. TLB缓存:

        为了加速地址转换过程,x86架构使用TLB(Translation Lookaside Buffer)缓存页表项,减少内存访问次数。

 上图是前向推理地址,笼统地解释x86保护模式下,逻辑地址如何转换成物理地址;

下图是后向反推,这里为了理想化地解释页目录与页表和页框的关系,页框被认为是真实的物理内存,连续的4k一个构成一个页框;

实际上进程的页表与页框的关系,并不是这么工整金字塔式的层级关系,而是由操作系统帮助进程分配和填充的,按照Linux kernel 中的内存管理模块的规则。

事实上,从  逻辑地址 ->  线性地址,是很简单的,基本上就是段选择子帮助挑选出来的全局描述符表项(GDT)中的段基地址,加上偏移,就等于,等于,等于,就是线性地址。

这个很丝滑,很简单;

然后,线性地址 ->  物理地址 也很丝滑:

线性地址  =  页目录索引    |     页表索引     |      页框内偏移

这很容易查找和计算处具体的物理地址;

但是,当将这两种丝滑放在一起是,马上容易懵掉。为什么两个阶段都这么丝滑,以至于无法理解。线性地址这个桥梁很神奇,得到线性地址的过程,与解析线性地址的含义,是两个不相交的世界。  这是问题的核心。

在这两个世界中打穿虫洞的方法,是 Linux 对CR3 寄存器的使用。

这个秘密值两万元以上的课程费,都不一定能听清楚  ^ ^

3, CR3 寄存器与进程的页目录

3.1 页目录

当 Linux 系统启动一个新的程序时,操作系统会为该程序创建一个新的页目录,这是为了实现每个进程的地址空间隔离和独立性。这个过程是虚拟内存管理的一部分,确保每个进程拥有自己的虚拟地址空间,从而提高系统的安全性和稳定性。

3.1.1创建新的页目录的步骤:

1. 分配页目录:

  • 操作系统为新进程分配一个新的页目录。这个页目录是一个包含多个页目录项(PDEs)的表,每个页目录项指向一个页表。

2. 初始化页目录:

  • 新的页目录会被初始化,其中一些条目会被设置为指向操作系统的共享页表,如那些包含共享库(如 C 标准库等)的页表。
  • 其他页目录项会被设置为指向新分配的页表,这些页表用于存储进程特有的数据,如代码段、数据段和堆栈。

3. 映射虚拟地址到物理地址:

  • 操作系统将程序的代码和数据加载到内存中,并在页表中创建相应的映射,将虚拟地址映射到物理内存地址。
  • 这包括设置适当的访问权限,例如,代码段可能被设置为只读和可执行,而数据段可能被设置为可读写。

4. 切换到新的页目录:

  • 在进程开始执行前,CPU 的页目录基址寄存器(CR3)会被更新为指向新进程的页目录的物理地址。
  • 这确保了当新进程开始执行时,CPU 的内存访问将根据新进程的页目录进行解析。

3.2 每个进程创建新的页目录的目的

  • 隔离性:每个进程拥有独立的页目录和页表,确保了进程间的内存隔离,一个进程不能直接访问或修改另一个进程的内存空间。
  • 安全性:通过为每个进程设置不同的内存访问权限,操作系统可以防止不当的内存访问,如阻止进程执行非代码区域的内存。
  • 稳定性:内存隔离减少了进程间相互影响的可能性,从而提高了系统的整体稳定性。

这种基于页目录和页表的内存管理机制是现代操作系统支持复杂多任务环境的基础,允许系统同时运行多个程序,而每个程序都在其自己保护的内存空间内运行。

3.2 CR3 与页目录

在 x86 架构中,CR3 寄存器(也称为页目录基址寄存器 PDBR)在将线性地址转换为物理地址的过程中起着至关重要的作用。
CR3 寄存器存储着当前使用的页目录的物理地址,这是虚拟内存管理中的一个关键组件。
CR3 寄存器的作用:
1. 存储页目录的物理地址
CR3 寄存器包含当前活动的页目录的物理内存地址。这个页目录包含了多个页目录项(PDEs),每个页目录项指向一个页表。
2. 启动地址转换
当处理器需要将线性地址(虚拟地址)转换为物理地址时,它首先访问 CR3 寄存器以获取页目录的位置。
处理器使用线性地址的高位部分(通常是最高的几位)来索引页目录,找到对应的页目录项,该项指向具体的页表。
接着,处理器使用线性地址的中间部分来索引该页表,找到对应的页表项(PTE),该项包含最终的物理页面地址。
最后,线性地址的低位部分(页内偏移)被添加到页面地址中,形成完整的物理地址。
3. 上下文切换时的角色
在进行进程切换时,操作系统会更新 CR3 寄存器以指向新进程的页目录的物理地址。这确保了每个进程都使用其自己的地址空间,从而实现内存隔离和保护。
更新 CR3 寄存器会导致处理器的页表缓存(TLB, Translation Lookaside Buffer)被刷新,以确保地址转换不会使用旧的、属于前一个进程的映射。

CR3 寄存器是实现 x86 架构中基于分页的虚拟内存管理的核心。
它不仅指示当前页目录的物理位置,还在进程上下文切换中发挥着重要作用,确保每个进程的内存空间得到正确管理和保护。

4, 结论分析:双重模板

由于页目录这个与进程一 一绑定的结构体,使得不同进程的线性地址的计算,都可以是简单地表示为 段基址 +  偏移,使得不同进程中的逻辑地址得到非常相似的 线性地址,但是在解析线性地址时,由于CR3所指向的页目录的不同,使得第三次丝滑地从相似的线性地址,推导出迥异的物理地址。

因此,不同进程之内线性地址的简单一致性,与得到具体物理地址的迥异复杂性,跟页目录的巧妙使用密不可分。

CR3

Linus 的这个设计中,叠加了双重模板编程思想:

<1.> 不同进程,只需要更换 CR3 这一个参数的值即可实现地址保护;

<2.> 不同 arch 的 CPU 只需要拿出一个寄存器来扮演 x86 中的 CR3, 即复用 Linux kernel中 相同的 MM 代码逻辑。

5,复盘整个过程

盯着这个图,思考上述过程,感受线性地址到物理地址过程中,页目录与CR3,这个三个丝滑的过程中所作用:

6,Linux 弱化了x86 架构中 gptr 的目的

Linus 处于对 Linux 通用性的考虑,鉴于 risc CPU 的 MM 都比较简单,risc 的体系结构中基本没有分段的思想体现,所以Linux kernel的MM思维中故意弱化了 x86 的 GPTR 寄存器的作用。主要发挥页目录 和 MMU 的功能,在物理内存分页的思想上,来实现进程空间的保护功能。

叹为观止

值100亿美元

致敬 《有机会赚100亿却只想写代码,Linux之父的传奇前半生》

综上所述,这个MM难理解也是正常的,确实是多个方面都巧夺天工

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

STM32 JTAG 模式和 SWD 模式的区别详解

在调试和编程 STM32 微控制器时&#xff0c;使用 JTAG&#xff08;Joint Test Action Group&#xff09;模式和 SWD&#xff08;Serial Wire Debug&#xff09;模式是两种常见的方法。它们在接口需求、调试能力、引脚数量、通信速度等方面各有特点。我们一般采用的的下载器如ST…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中&#xff0c;如果能熟练掌握以下这些使用频率很高的脚本&#xff0c;那工作起来真的是手拿把攥&#xff0c;事半功倍&#xff0c;接下来给大家介绍一些我们日常使用率很高的一些脚本&#xff01; 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…

MySQL数据库笔记(二)

第一章 单行函数 1.1 什么是函数 函数的作用是把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在SQL中使用函数,极大地提高了用户对数据库的管理效率。 1.2 定义 操作数据对象。 接受参数返回一个结果。 只对一行进行…

性能工具之 JMeter 常用组件介绍(八)

文章目录 一、Jmeter命令行启动二、Jmeter脚本录制 本文主要介绍JMeter命令行启动和脚本录制功能 一、Jmeter命令行启动 Jmeter有两种运行&#xff1a; 一种是采用的界面模式(GUI&#xff09;启动&#xff0c;会占用不少系统资源&#xff1b;另一种是命令行模式&#xff08;n…

力扣hot100:31. 下一个排列

LeetCode&#xff1a;31. 下一个排列 字典序的大小排序&#xff1a; 从前往后对比&#xff0c;如果先出现更小字符的&#xff0c;字典序更小&#xff0c;如果有个字符串结束了&#xff0c;则它更小。string s "112233"和string t "1122334"&#xff0c;…

训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: "sea", "eat"输出: …

71. UE5 RPG 实现敌人召唤技能

在这一篇文章中&#xff0c;我们要实现敌人的召唤师能够召唤自己的仆从进行作战。 要实现这个技能&#xff0c;我们首先创建新的敌人蓝图&#xff0c;用于召唤。接着&#xff0c;我们将实现一个召唤技能基类&#xff0c;在基类中实现在召唤师的周围获取到可以生成的位置点&…

数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

概述 MapReduce 是 Google 大数据处理的三姐马车之一&#xff0c;另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深。实际上&#xff0c;万变不离其宗&#xff0c;它的本质就…

【nginx】 nginx核心功能

【nginx】 nginx核心功能 1.nginx核心功能 1. 反向代理 2. 负载均衡 3. 动静分离 4. nginx的高可用2. 反向代理 正向代理: 该服务器代理的是客户端&#xff0c;对于服务器来说&#xff0c;不知道真实客户端的ip。比如: 翻墙软件。 访问国外的服务器---使用了翻墙软件----对…

响应式高端网站模板源码图库素材 资源下载平台源码

源码介绍 亲测可用&#xff0c;可用于做娱乐网资源网&#xff0c;功能非常的齐全无任何加密也无任何后门&#xff01;响应式高端网站模板源码图库素材 资源下载平台源码&#xff08;可运营&#xff09; 页面很美观&#xff0c;堪比大型网站的美工&#xff0c;而且页面做的也很…

GRIT论文阅读笔记

一篇试图统一生成任务和编码任务的工作&#xff0c;就是把只能完成生成任务的GPT改成既能生成又能encode。思路其实很简单&#xff0c;就是在输入的时候添加instruction tokens来指引模型做representation还是generation&#xff0c;然后各自算损失。representation任务用的是d…

【操作系统】操作系统实验02-生产者消费者程序改进

1. 说明文档中原有程序实现的功能、实现方法。&#xff08;用语言、程序流程图、为原有程序添加注释等方式均可&#xff09; 1.//const.h 2.//定义宏变量 3.#ifndef CONST_H 4.#define CONST_H 5. 6.#define TRUE 1 7.#define FALSE 0 8.#define ERROR 0 9.#define OVERFLOW -…

据阿谱尔APO Research调研显示,2023年全球水凝胶市场销售额约为14.2亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球水凝胶市场销售额约为14.2亿美元&#xff0c;预计在2024-2030年预测期内将以超过5.0%的CAGR&#xff08;年复合增长率&#xff09;增长。 水凝胶有多种应用&#xff0c;包括个人护理、制药、农业及其他…

界面组件Kendo UI for Angular 2024 Q2亮点 - 让应用程序界面拥有AI提示

随着最新的2024年第二季度发布&#xff0c;Kendo UI for Angular为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问…

卷积神经网络(CNN)理解

1、引言&#xff08;卷积概念&#xff09; 在介绍CNN中卷积概念之前&#xff0c;先介绍一个数字图像中“边缘检测edge detection”案例&#xff0c;以加深对卷积的认识。图中为大小8X8的灰度图片&#xff0c;图片中数值表示该像素的灰度值。像素值越大&#xff0c;颜色越亮&…

ByteTrack跟踪理解

1.ByteTrack 核心思路 &#xff08;1&#xff09;区分高置信度检测框与低置信度检测框&#xff0c;不同置信度检测框采取不同处理方式。 &#xff08;2&#xff09;保留低置信度检测框&#xff0c;在后续可能会重新确认为 confirm 状态。而不是像传统 MOT 算法选择删除。 2.…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

Nacos从入门到实战

一、Nacos介绍 1.什么是Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现&#xff08;Nacos Discovery&#xff09;、服务配置&#xff08;Nacos Config&#xff09;和服务管理平台 集 注册中心配置中心服务管理 平台 注册中心&#xff1a;把所有的服务注册进去…

Redis变慢了?

Redis变慢了&#xff1f; 什么是Redis&#xff1f;测定Redis变慢&#xff1f;最大响应延迟平均响应延迟设置Redis慢日志 分析Redis变慢bigkeysbigkey的危害bigkey优化 写在最后 什么是Redis&#xff1f; 作为一个技术人员来说&#xff0c;大家用的最多的可能就是Redis了&#…