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

【Linux】Linux程序地址基础

参考博客:https://blog.csdn.net/sjsjnsjnn/article/details/125533127

一、地址空间的阐述

1.1 程序地址空间

下面的图片展示了程序地址空间的组成结构

在这里插入图片描述

我们通过代码来验证一下

int g_unval;
int g_val = 100;int main(int argc, char *argv[]);void test1()
{int a = 10;int b = 20;const char *s = "hello world";printf("code addr:%p\n", main);       // 代码区printf("string rdonly addr:%p\n", s); // 字符常量区printf("init addr:%p\n", &g_val);     // 已初始化printf("uninit addr:%p\n", &g_unval); // 未初始化char *heap = (char *)malloc(10);printf("heap addr:%p\n", heap); // 堆区printf("stack addr:%p\n", &a);printf("stack addr:%p\n", &b);printf("stack addr:%p\n", &s);  // 栈区printf("stack addr:%p\n", &heap);
}

运行结果如下:

  1. 代码区的地址位于最低处,0x63e2eb7be37e
  2. 接着是字符串常量区0x63e2eb7bf004
  3. 然后是已初始化区0x63e2eb7c1010和未初始化区0x63e2eb7c1154
  4. 后面是堆区内存地址0x63e31e4b6ec0,堆区内存地址不是连续的
  5. 最后是栈区0x7fff3e007150~0x7fff3e007160,栈区地址是连续的
code addr:0x63e2eb7be37e
string rdonly addr:0x63e2eb7bf004
init addr:0x63e2eb7c1010
uninit addr:0x63e2eb7c1154
heap addr:0x63e31e4b6ec0
stack addr:0x7fff3e007150
stack addr:0x7fff3e007154
stack addr:0x7fff3e007158
stack addr:0x7fff3e007160

可以发现,打印的结果符合对应的地址结构

二、进程地址空间

2.1 程序虚拟地址打印

下面的代码演示创建一个子进程后,打印子进程和父进程程序变量的地址

void test2(){int ret = fork();if(ret == 0){std::cout << "I am child, g_val = " << g_val << ", &g_val = " << &g_val << std::endl;for(int i = 0 ; i< 5;++i){g_val--;std::cout << "==========change g_val=========" << std::endl;std::cout << "I am child, g_val = " << g_val << ", &g_val = " << &g_val << std::endl;sleep(1);}}else if(ret > 0){while(1){std::cout << "I am father, g_val = " << g_val << ", &g_val = " << &g_val << std::endl;sleep(1);}}else{std::cout << "error:" << strerror(ret) << std::endl;}}

运行结果如下:

  • 在没有修改变量的情况下,父进程和子进程中g_val的地址一样,指向同一块内存
  • 但是修改了子进程中值的大小后,g_val的值不同,打印出来的地址确是同一段
  • 这里涉及了虚拟地址,我们打印出来的地址实际上是虚拟机制,而不是物理地址

在这里插入图片描述

2.2 进程地址空间结构

  • 之前说‘程序的地址空间’是不准确的,准确的应该说成进程虚拟地址空间 ,每个进程都会有自己的地址空间,认为自己独占物理内存。
  • 操作系统在描述进程地址空间时,是以结构体的形式描述的,在linux中这种结构体是 struct mm_struct 。它在内核中是一个数据结构类型,具体进程的地址空间变量。

这些变量就是每个空间的起始位置与结束位置。如下图所示

在这里插入图片描述

进程地址空间就类似于一把尺子,每个空间都有对应的起始位置和结束位置。通过这个虚拟地址去间接访问内存;

为什么不能直接去访问物理内存?

如果没有进程地址空间的加持,那么程序就会直接访问物理内存,没有区间可言,会存在恶意程序可以>随意修改别的进程的内存数据,以达到破坏的目的。有些非恶意的,但是有bug的程序也可能不小心修改了其它程序的内存数据,就会导致其它程序的运行出现异常。这种情况对用户来说是无法容忍的,因为用户希望使用计算机的时候,其中一个任务失败了,至少不能影响其它的任务。

2.3 如何通过虚拟地址访问物理地址

  • 每个进程都是独立的虚拟地址空间,两个独立进程的相同地址互不干扰,但是在物理上对每个进程可能也就分了一部分空间给了某个进程。

  • 每个进程被创建时,其对应的进程控制块和进程虚拟地址空间也会随之被创建。而操作系统可以通过进程的控制块找到其进程地址空间,通过页表对将虚拟地址转换为物理地址,达到访问物理地址的目的。

  • 这种方式称之为映射,调度某个进程执行时,就要把它的地址空间映射到一个物理空间上。
    在这里插入图片描述

因此,最终得到的虚拟地址通过下述转换得到物理地址,虽然虚拟地址一致,但是通过不同进程中的映射关系,会得到不同的物理地址,这就是为什么虚拟地址一致,但是得到的值是不同的原因

在这里插入图片描述

写时拷贝:就是等到修改数据时才真正分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝

更多资料:https://github.com/0voice

相关文章:

【Linux】Linux程序地址基础

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125533127 一、地址空间的阐述 1.1 程序地址空间 下面的图片展示了程序地址空间的组成结构 我们通过代码来验证一下 int g_unval; int g_val 100;int main(int argc, char *argv[]);void test1() {i…...

React 项目初始化与搭建指南

React 项目初始化有多种方式&#xff0c;可以选择已有的脚手架工具快速创建项目&#xff0c;也可以自定义项目结构并使用构建工具实现项目的构建打包流程。 1. 脚手架方案 1.1. Vite 通过 Vite 创建 React 项目非常简单&#xff0c;只需一行命令即可完成。Vite 的工程初始化…...

将图形可视化工具的 Python 脚本打包为 Windows 应用程序

前文我们已经写了一个基于python的tkinter库和matplotlib库的图形可视化工具。 基于Python的tkinter库的图形可视化工具&#xff08;15种图形的完整代码&#xff09;:基于Python的tkinter库的图形可视化工具&#xff08;15种图形的完整代码&#xff09;-CSDN博客 在前文基础上&…...

AWS DocumentDB vs MongoDB:数据库的技术抉择

随着非关系型数据库在现代应用中的广泛应用&#xff0c;文档型数据库因其灵活的结构与出色的扩展性&#xff0c;逐渐成为企业开发与架构设计中的核心选择。在众多文档数据库中&#xff0c;MongoDB 凭借其成熟生态与社区支持占据主导地位&#xff1b;与此同时&#xff0c;AWS 提…...

无人机军用与民用技术对比分析

一、材料区别 军用无人机&#xff1a; 1. 高强度特种材料&#xff1a; 大量使用钛合金、碳纤维复合材料&#xff0c;兼顾轻量化与高强度&#xff0c;提升抗冲击性和隐身性能。 关键部件依赖进口材料。 2. 隐身涂层&#xff1a; 采用雷达吸波材料和低红外特征涂料&#xf…...

刷leetcode hot100--矩阵6/1

1.螺旋矩阵【很久】6/1【感觉就是思路的搬运工&#xff0c;没完全理解】 54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 原来想 但是如果是奇数矩阵&#xff0c;遍历不到中间 解决思路&#xff1a; 用left,right,top,down标记/限定每次遍历的元素&#xff0c;每次从…...

Qt 中实现文本截断(ellipsis)的功能。Qt 提供了此方法来处理过长的文本显示问题,例如在界面中限制文本长度并添加省略号(...)

QElidedText 并不是 Qt 中的标准类名或功能名称&#xff0c;但根据你的描述&#xff0c;你可能是指 QFontMetrics::elidedText() 方法。这是一个用于在 Qt 中实现文本截断&#xff08;ellipsis&#xff09;的功能。Qt 提供了此方法来处理过长的文本显示问题&#xff0c;例如在界…...

Cisco IOS XE WLC 任意文件上传漏洞复现(CVE-2025-20188)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...

基于ResNet残差网络优化梯度下降算法实现图像分类

文章目录 题 目: 基于ResNet残差网络优化梯度下降算法实现图像分类基于ResNet残差神经网络优化梯度下降算法实现海贼王图像分类引言1.ResNet残差神经网络介绍1.1 ResNet残差神经网络的研究现状1.2 ResNet残差神经网络的原理1.3 ResNet残差神经网络的实现步骤1.3.1导入必要的库…...

群晖NAS套件历史版本资源

有时候需要下载历史的群晖套件&#xff0c;可以通过以下地址前往 Synology Archive Download Site - Index of /download 该页面汇集了各类群晖应用程序的过往版本&#xff0c;方便用户根据需要选择特定版本的软件进行下载安装。这种方式适用于需要旧版软件兼容性或进行版本回…...

Docker轻松搭建Neo4j+APOC环境

Docker轻松搭建Neo4jAPOC环境 一、简介二、Docker部署neo4j三、Docker安装APOC插件四、删除数据库/切换数据库 一、简介 Neo4j 是一款高性能的 原生图数据库&#xff0c;采用 属性图模型 存储数据&#xff0c;支持 Cypher查询语言&#xff0c;适用于复杂关系数据的存储和分析。…...

定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究

摘要&#xff1a;本文聚焦无界零售背景下京东从零售产品提供者向零售基础设施提供者的转变&#xff0c;探讨定制开发开源AI智能名片S2B2C商城小程序在这一转变中的应用。通过分析该小程序在商业运营成本降低、效率提升、用户体验优化等方面的作用&#xff0c;以及其与京东AI和冯…...

CppCon 2015 学习:CLANG/C2 for Windows

Visual Studio 2015 引入了基于 CLANG/LLVM 的新代码生成器&#xff0c;及其背景和意义。简单理解如下&#xff1a; 理解要点&#xff1a; VS2015 中引入了全新的代码生成技术&#xff0c;性能和质量都很棒。这套新技术基于 Clang&#xff0c;微软展示了相关新工具。Clang 和…...

Spring中@Primary注解的作用与使用

在 Spring 框架中&#xff0c;Primary 注解用于解决依赖注入时的歧义性&#xff08;Ambiguity&#xff09;问题。当 Spring 容器中存在多个相同类型的 Bean 时&#xff0c;通过 Primary 标记其中一个 Bean 作为默认的首选注入对象。 核心作用&#xff1a; 解决多个同类型 Bean …...

Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统

Spring Boot Elasticsearch HBase 构建海量数据搜索系统 &#x1f4d6; 目录 1. 系统需求分析2. 系统架构设计3. Elasticsearch 与 HBase 集成方案4. Spring Boot 项目实现5. 大规模搜索系统最佳实践 项目概述 本文档提供了基于 Spring Boot、Elasticsearch 和 HBase 构建…...

[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)

Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解 文章目录 Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解1. UIO (Userspace I/O) 驱动方法完整示例代码 2. /dev/mem 直接内存映射方法完整示例代码 3. 自定义字符设备驱动方法完整示例代码 4. 方法对比总结5. 实战建议 在 Zyn…...

【大模型:知识图谱】--5.neo4j数据库管理(cypher语法2)

目录 1.节点语法 1.1.CREATE--创建节点 1.2.MATCH--查询节点 1.3.RETURN--返回节点 1.4.WHERE--过滤节点 2.关系语法 2.1.创建关系 2.2.查询关系 3.删除语法 3.1.DELETE 删除 3.2.REMOVE 删除 4.功能补充 4.1.SET &#xff08;添加属性&#xff09; 4.2.NULL 值 …...

六、数据库的安全性

六、数据库的安全性 数据库的安全问题 数据库中的数据是可以共享的数据共享必然带来数据库的安全性问题 数据库系统中的数据共享不能是无条件的共享数据库中数据的共享是在 DBMS 统一的严格控制之下的共享&#xff0c;即&#xff1a;只允许有合法使用权限的用户访其被授权的数…...

贪心算法应用:装箱问题(BFD算法)详解

贪心算法应用&#xff1a;装箱问题(BFD算法)详解 1. 装箱问题与BFD算法概述 1.1 装箱问题定义 装箱问题(Bin Packing Problem)是组合优化中的经典问题&#xff0c;其定义为&#xff1a; 给定n个物品&#xff0c;每个物品有大小wᵢ (0 < wᵢ ≤ C)无限数量的箱子&#xf…...

C#学习第27天:时间和日期的处理

时间和日期的核心概念 1. UTC 和 本地时间 UTC&#xff08;Coordinated Universal Time&#xff09;&#xff1a; 是一种不受时区影响的世界标准时间。在网络通信和全球协作中&#xff0c;用于统一时间度量 本地时间&#xff08;Local Time&#xff09;&#xff1a; 是根据所…...

编程技能:格式化打印05,格式控制符

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;格式化打印04&#xff0c;sprintf 回到目录…...

MPLAB X IDE ​软件安装与卸载

1、下载MPLAB X IDE V6.25 MPLAB X IDE | Microchip Technology 正常选Windows&#xff0c;点击Download&#xff0c;等待自动下载完成&#xff1b; MPLAB X IDE 一台电脑上可以安装多个版本&#xff1b; 2、安装MPLAB X IDE V6.25 右键以管理员运行&#xff1b;next; 勾选 I a…...

windows编程实现文件拷贝

项目源码链接&#xff1a; 实现文件拷贝功能&#xff08;限制5GB大小&#xff09; 81c57de 周不才/cpp_linux study - Gitee.com 知识准备&#xff1a; 1.句柄 句柄是一个用于标识和引用系统资源&#xff08;如文件、窗口、进程、线程、位图等&#xff09;的值。它不是资…...

[6-01-01].第12节:字节码文件内容 - 属性表集合

JVM学习大纲 二、属性表集合&#xff1a; 2.1.属性计数器&#xff1a; 2.2.属性表&#xff1a; 2.3.字节码文件组成5 -> 属性&#xff1a; 1.属性主要指的是类的属性&#xff0c;比如源码的文件名、内部类的列表等 2.4.字节码文件组成3 -> 字段&#xff1a; 1.字段中…...

基于机器学习的水量智能调度研究

摘要&#xff1a;随着城市化进程的加速和水资源供需矛盾的日益突出&#xff0c;传统的水量调度模式因缺乏精准预测和动态调控能力&#xff0c;难以满足现代供水系统对高效性、稳定性和节能性的要求。本文针对供水系统中用水峰谷预测不准确、能耗高、供需失衡等核心问题&#xf…...

深度解码:我如何用“结构进化型交互学习方法”与AI共舞,从学习小白到构建复杂认知体系

嗨&#xff0c;亲爱的学习者们&#xff0c;思考者们&#xff0c;以及所有渴望在知识海洋中自由翱行却时常感到迷茫的朋友们&#xff1a; 你是否也曾有过这样的深夜&#xff0c;面对堆积如山的学习资料&#xff0c;眼神迷离&#xff0c;内心却一片荒芜&#xff1f;明明每个字都…...

深入浅出 Scrapy:打造高效、强大的 Python 网络爬虫

在数据为王的时代,高效获取网络信息是开发者必备的技能。今天我将为大家介绍 Python 爬虫领域的王者框架——Scrapy。无论你是数据工程师、分析师还是开发者,掌握 Scrapy 都能让你的数据采集效率提升数倍! 项目地址:https://github.com/scrapy/scrapy 官方文档:https://do…...

ES6 Promise 状态机

状态机&#xff1a;抽象的计算模型&#xff0c;根据特定的条件或者信号切换不同的状态 一、Promise 是什么&#xff1f; 简单来说&#xff0c;Promise 就是一个“承诺对象”。在ES6 里&#xff0c;有些代码执行起来需要点时间&#xff0c;比如加载文件、等待网络请求或者设置…...

Axure 与 Cursor 集成实现方案

Axure 与 Cursor 集成实现方案 以下是一个完整的 Axure 与 Cursor AI 集成的原型实现方案&#xff0c;通过自定义 JavaScript 代码实现无缝对接&#xff1a; 一、整体架构设计 #mermaid-svg-f9hQDSN4hijU3mJY {font-family:"trebuchet ms",verdana,arial,sans-seri…...

汽车加气站操作工证考试重点

汽车加气站操作工证考试重点 一、汽车加气站操作工证考试主要内容 汽车加气站操作工证是从事CNG&#xff08;压缩天然气&#xff09;和LNG&#xff08;液化天然气&#xff09;加气站作业人员的必备资格证书。随着新能源汽车的快速发展&#xff0c;该证书的市场需求持续增长&a…...