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

本文主要是介绍【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
    在这里插入图片描述
  • 结论:进程地址空间建立进程管理与内存管理的联系在这里插入图片描述

这篇关于【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931188

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安