【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论:
本质编写的原因是我在复习过程中突然发现虚拟地址空间和C++内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章,本质是为了让我对Linux底层系框架有更好的理解和对C++语言和Linux系统的关系更近一步。
——————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


C/C++内存区域划分:

在C/C++中他的内存区域划分,由上而下主要由一下分构成:

  1. 栈区:它主要存储着局部域中的局部变量和函数调用信息(如函数参数、返回地址等)
  2. 堆区:它主要存储着给用户动态分配的内存空间(通过:malloc,free,new,delete 申请/释放)
  3. 静态区:它主要存储着全局变量和静态变量
  4. 常量区:顾名思义存储着常量和常量字符串已经可执行的代码

通过下面这张图来快速的理解和练习巩固记忆:
在这里插入图片描述

进程的虚拟地址空间

对于虚拟地址空间来说它的区间划分如下图:
不难发现其实和C++中的差不多,其中不同的是在Linux中:

  1. 静态区被称为数据段:同样存储的是进程的静态变量和全局变量
  2. 常量区被称为代码段:主要可以理解成它存储着可执行程序的代码以及代码中的常量
  3. 还多了两个:
  4. 内核空间:是留给操作系统内核使用的,一般来说用于处理一些底层系统服务、硬件操作
  5. 内存映射区(包含共享区):是指多个进程可以共享的一块内存区域,常见于共享库文件或特定数据段。其主要作用包括
    在这里插入图片描述

内存映射区(共享区)的细节:

  • 内存映射区是一个描述过程,指的是操作系统将物理内存划分并映射到虚拟地址空间中的不同区域。
  • 这个过程涉及将物理内存分配到内核空间、用户空间和共享区等不同区域。

内存映射区:

  1. 内存映射区涵盖了整个虚拟地址空间的划分,包括内核空间、用户空间和共享区等。
  2. 确保每个进程只能访问分配给它的内存区域,防止内核内存被用户程序访问。
  3. 通过段表和页表机制将物理内存映射到虚拟地址空间,实现内存的高效管理和保护
  4. 它是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
  5. 还能创建共享共享内存,做进程间通信。

共享区:

  1. 共享区是操作系统中允许多个进程共享相同内存区域的部分,通常用于共享库文件或特定数据段。
  • 它位于用户空间,并通过特定的机制确保多个进程能够协同使用这些内存区域。
  • 如下图:磁盘中的库通过物理地址加载到虚拟地址空间中的内存映射区

右下角的图来说就是:内存映射区的映射关系,每当一次和物理内存的交互就会生成一段映射区间(此处是线程的内存分配、管理和隔离中的一些和内核有关的属性)
在这里插入图片描述

总结

C++内存和Linux虚拟地址空间的关系是非常密切的,他们不同的在于Linux进程中多了一些其他的区域(内存映射区、内核空间),方便操作系统的操作!


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

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

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

相关文章

(论文)检测部分欺骗音频的初步调查

Paper–An Initial Investigation for Detecting Partially Spoofed Audio 摘要 所有现有的欺骗性语音数据库都包含整个欺骗性的攻击数据。 在实践中,使用仅部分欺骗的话语来装载成功的攻击是完全合理的。根据定义,部分欺骗的话语包含欺骗和真实段的混…

P9420 [蓝桥杯 2023 国 B] 子 2023

P9420 [蓝桥杯 2023 国 B] 子 2023 题目 分析代码 题目 分析 刚拿到这道题,我大脑简单算了一下,这个值太大了,直观感觉就很难!! 但是,你仔仔细细的一看,先从最简单的第一步入手,再…

第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database

4.4.1 数据库迁移原理 总结一下就是: 1. 数据库迁移命令的执行,其实就是生成在数据库执行的脚本代码(两个文件:数字_迁移名.cs 数字_迁移名.Designer.cs),用于对数据库进行定义和修饰。 2. 数据库迁移…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中,C 语言宛如一座巍峨的高山,吸引着无数开发者攀登探索。而 Linux 操作系统,以其开源、稳定、高效的特性,成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合,就如同为开发者配备了一把无坚不…

ubuntu:桌面版磁盘合并扩容

下载gparted磁盘编辑器 apt-get install gparted 打开gparted 更改目标分区大小 当遇到这个报错时,需要在命令行执行原分区的挂载指令 查看该分区信息 记住该目录,并在命令行执行 mount -o remount -rw /# 示例:mount -o remount -rw /v…

使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

在 Kubernetes 1.24及以上版本环境中,docker不再被支持,主要使用Containerd 是常用的容器运行。默认情况下,Containerd 使用 HTTPS 协议与镜像仓库通信。然而,在某些场景下(如测试环境或内部网络)&#xff…

【论文笔记-TPAMI 2024】FreqFusion:用于密集图像预测的频率感知特征融合

Frequency-aware Feature Fusion for Dense Image Prediction 用于密集图像预测的频率感知特征融合 Abstract:密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点,现代分层模型通常利用特征融合,直接添加…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

【deepseek】本地部署+webui访问

背景 最近deepseek很火,但是官网的老是被限流使用,还有就是自己也想着玩一玩,于是准备在自己电脑跑一个 直接附上结果地址mydeepseek 准备工作 windows和linux都可 我这里选择linux,ubuntu系统 安装ollama 看下图&#xff0…

【Vue工作原理】初始化启动文件加载流程

参考资料:配置参考 | Vue CLI vue-cli项目如果项目根目录下没有vue-config.js文件,默认入口文件entry,模板文件template,以及filename分别是什么?(参考DeepSeek回答) 根据Vue CLI文档,当没有配…

【构建工具】Gradle 8中Android BuildConfig的变化与开启方法

随着Gradle 8的发布,Android开发者需要注意一个重要变化:BuildConfig类的生成现在默认被关闭了!!!。这个变化可能会影响许多依赖于BuildConfig的项目(别问,问就是我也被影响了,多好用…

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…

每日Attention学习24——Strip Convolution Block

模块出处 [TIP 21] [link] CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery 模块名称 Strip Convolution Block (SCB) 模块作用 多方向条形特征提取 模块结构 模块特点 类PSP设计,采用四个并行分支提取不同维度的信息相比于…

ctfshow——版本控制泄露源码

题目提示:版本控制很重要,但不要部署到生产环境更重要。 题目内容如下图所示 本题结合题目和提示可以知道,我们要通过查看生产环境来查找flag。 所以我们可以在URL上进行操作,这时候就需要目录扫描来查看了。 发现存在一个.git的…

关于网络端口探测:TCP端口和UDP端口探测区别

网络端口探测是网络安全领域中的一项基础技术,它用于识别目标主机上开放的端口以及运行在这些端口上的服务。这项技术对于网络管理和安全评估至关重要。在网络端口探测中,最常用的两种协议是TCP(传输控制协议)和UDP(用…

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要:纯电动商用车的工作环境存在路况复杂、工况恶劣等情况,导致整车电气设备的磨损速率加快,造成电气设备绝缘电阻持续下降,如不及时处理,可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…

LeetCode详解之如何一步步优化到最佳解法:14. 最长公共前缀

LeetCode详解系列的总目录(持续更新中):LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接:LeetCode详解之如何一步步优化到最佳解法&am…

使用VS Code远程开发OpenAI API

由于OpenAI的API在国内不可用,我们要针对API进行开发困难比较大。 如果你有一个能使用OpenAI API的Linux服务器,我们可以方便地使用VS Code的远程开发功能来解决这个问题。 如果没有,你也可以试试获得一个免费的国外服务器,网上有…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统,作者为蒲乐天,后端基于puyuetianPHP框架驱动,前端基于 puyuetianUI框架驱动,默认编辑器为puyuetianEditor富文本编辑器,其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

Java线程池入门03

1. 这3种创建线程池的方式有风险 FixedThreadPool : 固定大小的线程池SingleThreadExecutor : 单个线程的线程池CachedThreadPool : 可缓存的线程池 FixedThreadPool内部其实也是使用ThreadPoolExecutor来创建的 等价于 : new ThreadPoolExecutor(nThreads, nThreads, 0L, Tim…