当前位置: 首页 > news >正文

11.程序地址空间_2

在上一章的内容之中我们已经发现此时全局变量的值已经被修改了,但是同样地址的情况下,其中的数据内容竟然是不一样的
接下来我想来详细解释一下,让我们彻底弄明白进程地址空间

进程地址空间的编址过程(32位机器下)

首先要明确一下几点

  • 进程地址空间描述的基本空间大小是字节
  • 32位之下可生成2^32个地址,一个地址指向的一块空间内容是一个字节一个地址对应唯一一个字节,同时唯一性也就是地址最大的意义
  • 也就是说说我们最终生成的是一个4GB的空间

这样一块地址空间由什么管理呢?

mm_struct

mm_struct 是 Linux 内核中用于描述进程地址空间的核心数据结构,它在内存管理中扮演着至关重要的角色。下面是它如何管理进程地址空间的详细解析:


mm_struct 的作用

mm_struct 是每个进程唯一的内存描述符,主要用于管理该进程的整个虚拟地址空间。它通过多个成员变量和辅助结构来实现这一功能。


核心组成与管理机制

  • 虚拟地址空间布局

    • mm_struct 包含指向多个 vm_area_struct 的指针,这些结构体描述了虚拟地址空间中的各个区域(如代码段、数据段、堆、栈等)。
    • 每个 vm_area_struct 表示一个连续的虚拟地址区间,并记录其访问权限、映射类型等信息。
  • 页表管理(这个暂时先忽略咱们接着往下看)

    • pgd(Page Global Directory)是页表的顶层指针,mm_struct 通过它管理整个页表结构。
    • 页表用于将虚拟地址映射到物理地址,是内存访问的基础。
  • 内存映射与文件映射

    • mmap 操作会在 mm_struct 中添加新的 vm_area_struct,用于映射文件或设备到进程地址空间。
  • task_struct 的关系

    • 每个进程的 task_struct 中有一个指向 mm_struct 的指针。
    • 对于线程,task_struct 中的 mm 指针可能指向同一个 mm_struct

task_struct和mm_struct的链接

首先一句话来介绍task_struct 他是 Linux 内核中用于全面描述一个进程的结构体,掌管其身份、状态、资源、调度信息等,是进程管理的“指挥中心”。
同时他也指向了这一个进程的虚拟地址空间.

虚拟地址和物理地址进行链接

现在我们知道这个程序跑起来之后,要运行,首先就要被task_struct 进行管理,pid,进程优先级等等信息都要被进行管理,并且会指向一块虚拟进程空间,这块空间被分成栈区、堆区、数据段、代码段,在我们取地址之后看到的也就是这里的地址。
但是我们同样也知道这个程序是一定会被放到CPU上去运行的。那这快虚拟地址和物理地址之间应该一定是有联系的。那是如何完成过这样的链接的呢?

  • 页表管理(这个暂时先忽略咱们接着往下看)
    • pgd(Page Global Directory)是页表的顶层指针,mm_struct 通过它管理整个页表结构。
    • 页表用于将虚拟地址映射到物理地址,是内存访问的基础。

现在我们可以来看这块内容了,页表将虚拟与物理地址相互链接。
页表是操作系统中用于实现虚拟地址到物理地址映射的关键数据结构,是现代内存管理的核心机制之一。下面是对页表的简明解析:


什么是页表?

页表(Page Table)是操作系统为每个进程维护的一张映射表,用于将虚拟地址空间中的“页号”转换为物理地址空间中的“页框号”。


页表的组成与工作原理

  • 虚拟地址划分

    • 虚拟地址通常被分为两部分:页号 + 页内偏移。
    • 页号用于查找页表,页内偏移用于定位页内具体地址。
  • 页表项(PTE)

    • 每个页表项记录一个虚拟页对应的物理页框地址。
    • 还包含访问权限、是否在内存中、是否被修改等标志位。
  • 地址转换过程

    1. CPU 生成虚拟地址。
    2. 操作系统查页表,根据页号找到对应的物理页框。
    3. 加上页内偏移,得到最终物理地址。
  • 多级页表

    • 为节省内存,现代系统采用多级页表(如二级或三级页表)。
    • 每级页表负责一部分地址解析,逐级定位最终页表项。

所以为什么不直接使用物理地址?

愿意也就是页表的优势

  • 隔离性:每个进程有独立页表,防止互相干扰。
  • 灵活性:虚拟地址空间可以远大于物理内存。
  • 安全性:通过权限控制防止非法访问。

通过这副图可以进行理解

在这里插入图片描述

http://www.dtcms.com/a/470113.html

相关文章:

  • Java的方法重写/覆盖
  • 门户网站建站要求外国做家具的网站
  • 『 数据库 』MySQL复习(表的约束)
  • 房地产开发公司网站源码做高端网站的公司
  • 【vue】使用web worker上报日志:
  • MySQL 与Power BI 的作用,以及在数据分析中扮演的角色
  • k歌里的相片是通过网站做的吗typecho与Wordpress同步
  • 如何做中英版网站简单写文章的网站
  • Linux 进程通信——基于责任链模式的消息队列
  • 手机能做网站吗北京软件开发公司哪家专业
  • 物流网站的建设免费推广平台排行榜
  • iOS一直讲的单元格优化
  • 信阳网站seo用手机怎么做网站
  • 【Canvas技法】 卡通版太阳的三种画法
  • 词根学习笔记 | Agri系列
  • PHP解决跨域请求问题的两种实用方法
  • 语音大模型自监督训练思路
  • 辉芒微单片机FT60E12X,Touch 系列8位单片机MCU简要分析
  • w3c网站代码标准规范自己做的网站怎么接入网页游戏
  • 一篇文章详细解析 IPv4地址
  • 主办单位性质与网站名称不符绍兴专业做网站公司
  • C++ 简介
  • ValueTuple 详解
  • 框架--MyBatis
  • 1.C++基础(上)
  • cursor一些简单的使用心得官方的建议
  • 新能源汽车公司如何落地 ASPICE
  • 网站建设中的注册和登录页面网站开发技术期末考试题
  • react hooks
  • 建立数据分析与决策体系