【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解

前言

大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.什么是进程地址空间?
    • 1.进程地址空间基本概念
    • 2.mm_struct 基本概念
    • 3.mm_struct/进程地址空间 实现“区域划分”的原理
  • 二.什么是页表?
    • 1.页表基本概念
    • 2.进程是如何和“页表”进行联系?
    • 3.每个进程都有页表,页表在“进程切换”如何跟踪
  • 三.地址空间&页表的作用机理
    • 1.地址空间&页表的基本原理
    • 2.【页表实验1】探究为什么一对父子进程,同样虚拟地址,读取数据不同?(OS对页表的调整)
    • 3.【页表实验2】为什么可执行程序中有大量代码和数据,加载到内存任意位置都可以,不用考虑顺序位置(页表映射功能)
    • 4.【页表实验3】为什么字符常量区不可被修改?它曾经是如何被修改的?(页表的权限控制功能)
    • 5.【页表实验4】一个游戏的大小远比内存大,他在内存中如何加载呢?(页表如何实现linux挂起状态)
    • 6.【页表实验5】缺页中断(进程地址空间建立“进程管理”与“内存管理”的联系)【全流程配图详解】(重点)

一.什么是进程地址空间?

1.进程地址空间基本概念

  1. 每一个 进程 运行之后,都会有一个进程地址空间 的存在
  2. 进程地址空间是操作系统OS 给进程花的大饼 欺骗进程他有足够的空间用——使每个进程都认为自己独占系统内存资源。(即虚拟空间)
  3. 结论:进程地址空间并不是物理内存,而是 虚拟内存 的一部分(虚拟地址,不具备存储能力)
  • 进程地址空间本质上是一种 抽象概念 ,用于描述进程如何看待和使用内存。
  1. 每个进程都有自己的内存地址范围,这样就不会与其他进程发生冲突。进程地址空间通常被划分为几个部分,包括代码段、数据段、堆和栈等,每个部分都有其特定的用途。
    在这里插入图片描述

2.mm_struct 基本概念

  1. 进程地址空间需要被操作系统OS 管理 起来,每一个进程都有地址空间,需要 被先描述再组织 ,因此地址空间是一个内核的 数据结构(内核结构体) ,即我们接下来要提到的 mm_struct
  2. 先描述再组织原理博客:【Linux】程序员一定要了解的计算机管理理念——描述与组织(9)

3.mm_struct/进程地址空间 实现“区域划分”的原理

  1. mm_struct 及其实现区域划分的原理: 对一段线性空间设置start与end
  • 我们在这里举个例子:小胖和小花同学要对座位进行“区域划分”,我们 从计算机语言角度如何实现呢?
    在这里插入图片描述
  • 如下所示,我们通过将其 描述成结构体 对一段线性空间设置start与end,实现了区域划分
struct destop_area
{
    int total size;
    int xiaopang_start;
    int xiaopang_end;
    int xiaohua start;
    int xiaohua end;
}

struct destop_area area={100,0,50,50,100};
  • 我们打开linux内核结构体源码,也可以找到证明
    在这里插入图片描述

二.什么是页表?

1.页表基本概念

  • 引入:进程地址空间即虚拟地址,不具备存储能力
  1. 因此操作系统OS会对每个进程维护一张 映射表 对应着虚拟地址和物理地址 ,这就是 页表
  2. 页表是一种特殊的数据结构,它位于系统空间的页表区
  3. 页表还具有 权限控制 的功能,可以通过设置页表项的 权限位,实现对内存的读、写、执行等操作的控制。
    在这里插入图片描述

2.进程是如何和“页表”进行联系?

  • 进程各种访问寻址的前提, 一定是它在cpu上运行
  • cpu上有个 特殊寄存器cr3 ,他会保存页表地址,物理地址(页表地址会保存在进程的上下文当中)
    在这里插入图片描述

3.每个进程都有页表,页表在“进程切换”如何跟踪

根据第二小点内容:

  • 答: 经过cpu后,页表地址加载到上下文中保存好, 一起切换
  • 原理:进程切换时,地址也会被保存。

三.地址空间&页表的作用机理

1.地址空间&页表的基本原理

  • 如图:
  • 页表的主要作用是将虚拟地址空间映射到物理内存空间,实现虚拟地址到物理地址的转换。
    在这里插入图片描述

2.【页表实验1】探究为什么一对父子进程,同样虚拟地址,读取数据不同?(OS对页表的调整)

  • 我们经过fork,子进程经过写时拷贝会将页表 完整拷贝 下来一份
    (写时拷贝博客:【C++】STL容器——【深浅拷贝】与【写时拷贝】对比详解(拷贝构造)(10))
  • 因为 进程具有独立性 ,我们进行写入操作时,我们无法通过子进程修改父进程(对应同一块物理内存)
    在这里插入图片描述
  • 于是,操作系统会单独给子进程开辟一块新的物理地址
    在这里插入图片描述

3.【页表实验2】为什么可执行程序中有大量代码和数据,加载到内存任意位置都可以,不用考虑顺序位置(页表映射功能)

  • 答:地址空间,以无序变有序——是加载到内存任意位置都可以,不用考虑顺序位置, 因为都会被页表映射
  • 【减小内存管理成本,没有页表每次都要变化pcb】
  • 分析:进程地址空间, 让进程以统一的视角看待内存
  • 一个进程,可以通过地址空间+页表可以将 乱序/乱序 的内存数据,变成 有序 ,分门别类的规划好!在这里插入图片描述

4.【页表实验3】为什么字符常量区不可被修改?它曾经是如何被修改的?(页表的权限控制功能)

  • 我们运行下面所示程序,程序会崩溃
int main()
{
  char *str= “hello Linux”;   //常量区曾经是如何被修改的?
  *str= 'H';   //常量区不可被修改
 
  return 0;
}
  • 核心原理:页表还具有 权限控制 的功能,可以通过设置页表项的 权限位,实现对内存的读、写、执行等操作的控制。
    在这里插入图片描述

问:为什么程序会崩溃?

  • 答:语言程度上:字符常量区不可被修改
  • 答:进程地址空间上: 页表权限设置 只读 ,所以不可被修改

问:曾经又是如何被加载的?

  • 答:进程地址空间上: 页表权限设置 可读写 ,所以可以被修改

5.【页表实验4】一个游戏的大小远比内存大,他在内存中如何加载呢?(页表如何实现linux挂起状态)

  • 系统并不需要全部将其加载到内存中,加载一部分/不加载,需要时加载
  • 其中涉及到挂起状态

页表如何实现linux挂起状态?

  • 页表中有一个字段, 标志内存是否要分配空间 && 有内容
  • 例如:00 01 11 10 二进制形式来表示【是否分配&& 有内容】在这里插入图片描述
  • 页表实现linux挂起状态
  • 把原来的11状态变成00状态
    在这里插入图片描述

6.【页表实验5】缺页中断(进程地址空间建立“进程管理”与“内存管理”的联系)【全流程配图详解】(重点)

全流程讲解:

  1. 当前有个进程开始访问,通过cpu得到了页表的地址,访问页表,想找到物理地址
  2. 此时页表并没有物理地址,属于缺页;于是进入暂停状态
  • 假设此时状态为下图
    在这里插入图片描述
  1. 这时操作系统就把磁盘中的程序加载到内存中,并把物理地址填入缺失的页中
    在这里插入图片描述
  2. 此时属于"已分配(物理地址)"状态,标志位置1
    在这里插入图片描述
  • 结论:进程地址空间建立进程管理与内存管理的联系在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

2024免费最好用的苹果电脑mac虚拟机工具Parallels Desktop19中文版下载

一、软件概述 Parallels Desktop是一款专为Mac设计的虚拟机软件,它允许用户在Mac上同时运行Windows、Linux等多个操作系统,而无需额外的硬件设备。通过Parallels Desktop,Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序。…

Burpsuite CA证书导入浏览器、导入本地

前言 为什么要导入证书,因为要获得浏览器的信任、本地的信任;才能抓包 导入浏览器 1.从bp导出证书 然后打开火狐浏览器 打开bp,设置好代理 火狐浏览器foxyproxy开启代理 访问https://www.baidu.com 可以抓到https的包 本地导入CA证书 可能某一天你要…

AIGC实战——基于Transformer实现音乐生成

AIGC实战——基于Transformer实现音乐生成 0. 前言1. 音乐生成的挑战2. MuseNet3. 音乐数据3.1 巴赫大提琴组曲数据集3.2 解析 MIDI 文件3.3 分词3.4 创建训练数据集 4. MuseNet 模型4.1 正弦位置编码4.2 多输入/输出 5. 音乐生成 Transformer 的分析6. 多声部音乐分词6.1 网格…

牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目 题目链接: https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d 思路 最长路径有两种情况: 1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。 2.最长路径没有经过根节点&#xf…

JavaSE——常用API进阶二(8/8)-Arrays、Comparable、Comparator(Arrays类提供的的常见方法、用法示例)

目录 Arrays Arrays类提供的的常见方法 用法示例 Comparable、Comparator Comparable Comparator 本篇学习Arrays,不算作是重点知识,但是为学习后面的Lambda表达式打一个基础,或者说,作为铺垫。 Arrays 用来操作数组的一个…

初见-响应式编程-002

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace #Reacti…

lnmp架构

目录 环境 步骤 下载nginx源码包,并解压 安装依赖包 进行预编译 、编译安装 安装php、设置开机自启 配置nginx让其支持php服务 浏览器测试 安装mariadb 部署discuz论坛 简介 LNMP架构是一种常见的Web服务器架构,由Linux、Nginx、MySQL和PHP组成。它…

高级数据结构—线段树(一)

学线段树的原因是因为cf的一道题目始终想不出来怎么优化,后来知道区间查询和修改要用到线段树。。。 原题:Iva & Pav 线段树的作用 区间最值查询:可以高效地找到给定区间内的最大值、最小值等。 区间和查询:可以高效地计算…

Leetcode算法训练日记 | day34

专题九 贪心算法 一、K次取反后最大化的数组和 1.题目 Leetcode:第 1005 题 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个…

关于Spring事务管理之默认事务间调用问题

由事务的传播行为我们知道, 如果将方法配置为默认事务REQUIRED在执行过程中Spring会为其新启事务REQUIRES_NEW, 作为一个独立事务来执行. 由此存在一个问题。 如果使用不慎, 会引发org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back bec…

ACE框架学习

目录 ACE库编译 ACE Reactor框架 ACE_Time_Value类 ACE_Event_Handler类 ACE定时器队列类 ACE_Reator类 ACE Reactor实现 ACE_Select_Reactor类 ACE_TP_Reactor类 ACE_WFMO_Reactor类 ACE库编译 首先去ACE官网下载安装包,通过vs2017或者2019进行编译&#x…

【洛谷 P8605】[蓝桥杯 2013 国 AC] 网络寻路 题解(图论+无向图+组合数学)

[蓝桥杯 2013 国 AC] 网络寻路 题目描述 X X X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种…

10.接口自动化测试学习-Pytest框架(2)

1.mark标签 如果在每一个模块,每一个类,每一个方法和用例之前都加上mark标签,那么在pytest运行时就可以只运行带有该mark标签的模块、类、接口。 这样可以方便我们执行自动化时,自主选择执行全部用例、某个模块用例、某个流程用…

数据分析专家能力模型

招式:懂商业(业务能力) 外功更偏重于技能,首先需要懂招式,即懂商业,数据分析最终是为业务服务的,无论是互联网企业准求的用户增长和UJM分解,还是传统企业追求的降本增效和精细化运营…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

重建大师出现“密集匹配失败”的情况是什么原因?

答:一般出现密集匹配失败的情况,就是瓦块连接点过少,空瓦块边缘瓦块等原因导致。遇见这种情况,确定是边缘瓦块导致后,就可以不用管,不是模型主体,不影响成果。 重建大师是一款专为超大规模实景三…

MySQL__索引

文章目录 😊 作者:Lion J 💖 主页: https://blog.csdn.net/weixin_69252724 🎉 主题: MySQL__索引) ⏱️ 创作时间:2024年04月23日 ———————————————— 索引介绍…

消消乐算法总结

前言 最近在工作中遇到一个问题,做一个消消乐的demo项目,连续相同数目超过四个后就要消除。我在网上看了很多解决方案,有十字形,横向,纵向,梯形搜索。越看越迷糊。这不是用一个BFS就能解决的问题吗&#x…

MySQL数据库进阶篇一(存储引擎、索引)

目录 一、存储引擎1.1、MySQL体系结构:连接层,Server层,引擎层,存储层1.2、存储引擎1.2.1、存储引擎:InnoDB(MySQL 5.5后默认的存储引擎)1.2.2、存储引擎:MyISAM (MySQL早期默认存储引擎)1.2.3、存储引擎&a…