Linux的学习之路:11、地址空间

摘要

本章主要是说一下地址空间,我也只是按照我的理解进行解释,可能说不清楚,欢迎指正

目录

摘要

一、空间布局图

二、代码测试一下

三、进程地址空间

四、测试代码


一、空间布局图

如下方图片可以看出地址空间有几种,这里没有画全,这里就是说一下正文代码空间也就是代码段、初始化数据、未初始化数据、堆、栈、命令行参数环境变量。

这里利用代码进行测试一下,看看是否和上面说的一样,如下方代码,这里测试李哥数据,如下方截图,在截图中可以看的出代码段的空间是最小的,如上方图中所示,代码空间是从下向上的,也就是下面最小上面最大,这里看可以从下方测试截图可以看出。

在下方测试截图中的可以看出栈的空间是向下增加的,堆的空间是向上增加的。

 1 #include <stdio.h>                                                                                                                                                                                            
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 
  5 int main()
  6 {
  7     printf("正文代码:%p\n",&main);
  8     int a=0;
  9     int b;
 10     printf("初始化数据空间:%p\n",&a);
 11     printf("未初始化数据空间:%p\n",&b);
 12     int* p1=(int*)malloc(10);
 13     int* p2=(int*)malloc(10);
 14     int* p3=(int*)malloc(10);
 15     int* p4=(int*)malloc(10);
 16     printf("申请的堆空间:%p\n",p1);
 17     printf("申请的堆空间:%p\n",p2);
 18     printf("申请的堆空间:%p\n",p3);
 19     printf("申请的堆空间:%p\n",p4);
 20     printf("申请的栈空间:%p\n",&p1);
 21     printf("申请的栈空间:%p\n",&p2);
 22     printf("申请的栈空间:%p\n",&p3);
 23     printf("申请的栈空间:%p\n",&p4);
 24     return 0;
 25 }

二、代码测试一下

如下图的测试就可以看出我定义了一个变量val去进行测试地址,结果在子进程中更改了数值,结果发现父进程的数值没有更改,但是两个地址是一样的,这是什么情况?得出了下方的结论:

变量内容不一样,所以父子进程输出的变量绝对不是同一个变量,但地址值是一样的,说明,该地址绝对不是物理地址!在Linux地址下,这种地址叫做 虚拟地址,我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,OS必须负责将 虚拟地址 转化成 物理地址 。

  4 int val=100;
  5 int main()
  6 {
  7     pid_t id=fork();
  8     printf("正文代码:%p\n",&main);
  9     int a=0;
 10     int b;
 11     printf("初始化数据空间:%p\n",&a);
 12     printf("未初始化数据空间:%p\n",&b);
 13     int* p1=(int*)malloc(10);   
 14     int* p2=(int*)malloc(10);
 15     int* p3=(int*)malloc(10);
 16     int* p4=(int*)malloc(10);                                                                                                                                                                                 
 17     printf("申请的堆空间:%p\n",p1);
 18     printf("申请的堆空间:%p\n",p2);
 19     printf("申请的堆空间:%p\n",p3);
 20     printf("申请的堆空间:%p\n",p4);
 21     printf("申请的栈空间:%p\n",&p1);
 22     printf("申请的栈空间:%p\n",&p2);
 23     printf("申请的栈空间:%p\n",&p3);
 24     printf("申请的栈空间:%p\n",&p4);
 25     if(id==0)
 26     {
 27         int i=0;
 28         while(1)
 29         {
 30             if(i==5)
 31             {
 32                 val=200;
 33             }
 34             printf("子进程:%d,地址:%p\n",val,&val);
 35             sleep(1);  
 36             i++;                        
 37         }              
 38     }
 39     else                                                           
 40     {                                                            
 41         while(1)                                          
 42         {                             
 43             printf("父进程:%d,地址:%p\n",val,&val);   
 44             sleep(1);                         
 45         }                                                                                                         
 46     }                 
 47     return 0;
 48}

三、进程地址空间

之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看下方图片,这里就出现了一个名词叫做页表,这个页表也就是用来储存虚拟地址的,然后通过OS处理通过这个页表进行映射从而找到物理空间,这里就可以的出上面我所用代码得出的地址只是个虚拟地址,而更改了数据后,OS就把页表中储存的虚拟地址映射的物理地址换了一个地方,所以子进程和父进程的虚拟地址使用一个。

四、测试代码

#include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 int val=100;
  5 int main()
  6 {
  7     pid_t id=fork();
  8     printf("正文代码:%p\n",&main);
  9     int a=0;
 10     int b;
 11     printf("初始化数据空间:%p\n",&a);
 12     printf("未初始化数据空间:%p\n",&b);
 13     int* p1=(int*)malloc(10);   
 14     int* p2=(int*)malloc(10);
 15     int* p3=(int*)malloc(10);
 16     int* p4=(int*)malloc(10);                                                                                                                                                                                 
 17     printf("申请的堆空间:%p\n",p1);
 18     printf("申请的堆空间:%p\n",p2);
 19     printf("申请的堆空间:%p\n",p3);
 20     printf("申请的堆空间:%p\n",p4);
 21     printf("申请的栈空间:%p\n",&p1);
 22     printf("申请的栈空间:%p\n",&p2);
 23     printf("申请的栈空间:%p\n",&p3);
 24     printf("申请的栈空间:%p\n",&p4);
 25     if(id==0)
 26     {
 27         int i=0;
 28         while(1)
 29         {
 30             if(i==5)
 31             {
 32                 val=200;
 33             }
 34             printf("子进程:%d,地址:%p\n",val,&val);
 35             sleep(1);  
 36             i++;                        
 37         }              
 38     }
 39     else                                                           
 40     {                                                            
 41         while(1)                                          
 42         {                             
 43             printf("父进程:%d,地址:%p\n",val,&val);   
 44             sleep(1);                         
 45         }                                                                                                         
 46     }                 
 47     return 0;
 48}
                        

 

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

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

相关文章

论文笔记:Time Travel in LLMs: Tracing Data Contamination in Large Language Models

iclr 2024 spotlight reviewer评分 688 1 intro 论文认为许多下游任务&#xff08;例如&#xff0c;总结、自然语言推理、文本分类&#xff09;上观察到的LLMs印象深刻的表现可能因数据污染而被夸大 所谓数据污染&#xff0c;即这些下游任务的测试数据出现在LLMs的预训练数据…

java的深入探究JVM之内存结构

前言 Java作为一种平台无关性的语言&#xff0c;其主要依靠于Java虚拟机——JVM&#xff0c;我们写好的代码会被编译成class文件&#xff0c;再由JVM进行加载、解析、执行&#xff0c;而JVM有统一的规范&#xff0c;所以我们不需要像C那样需要程序员自己关注平台&#xff0c;大…

实景三维技术在公共安全领域的应用

随着科技的不断发展&#xff0c;实景三维技术在公共安全领域的应用越来越广泛。实景三维技术是指通过采集现实世界的三维数据&#xff0c;构建出真实的三维场景&#xff0c;进而实现对现实世界的数字化模拟和重建。在公共安全领域&#xff0c;实景三维技术的应用不仅可以提高安…

《云原生安全攻防》-- 云原生攻防矩阵

在本节课程中&#xff0c;我们将开始学习如何从攻击者的角度思考&#xff0c;一起探讨常见的容器和K8s攻击手法&#xff0c;包含以下两个主要内容&#xff1a; 云原生环境的攻击路径: 了解云原生环境的整体攻击流程。 云原生攻防矩阵: 云原生环境攻击路径的全景视图&#xff0…

服务器负载均衡SLB/加密原理

多台服务器提供相同的服务 SLB(server load balancing) 多台服务器对应一个虚拟地址&#xff0c;该地址是防火墙虚拟出来的。 服务器负载均衡功能仅支持IPV4协议 多通道协议仅支持FTP协议

逆向IDA中Dword,数据提取

我们可以看见数据是这样的&#xff0c;第一个是1cc 但是我们shifte就是 这个因为他的数据太大了&#xff0c;导致高位跑后面去了 这个时候&#xff0c;我们右键——convert——dword 这样就可以提取到争取的数据了 比如第一个数据 0x1cc a0xcc b0x1 print(hex((b<<8…

M系Mac关闭SIP

文章目录 M系Mac关闭SIP一&#xff1a;查看SIP状态二&#xff1a;关闭SIP步骤 M系Mac关闭SIP 一&#xff1a;查看SIP状态 1、使用终端 打开终端 输入csrutil status&#xff0c;回车 你会看到以下信息中的一个&#xff0c;指示SIP状态 已打开 System Integrity Protection s…

C#引用外部组件的常用方法

我们在开发程序过程中&#xff0c;时常会使用到第三方组件&#xff0c;比如一些通信、UI组件等。常用的引用方法有下面几种。 01 NuGet引用 NuGet是.NET的一个包管理平台&#xff0c;很多开源组件会通过NuGet进行管理和发布。比如我们常用的S7NetPlus等。 从NuGet中引用组件…

吴恩达llama课程笔记:第四课提示词技术

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

OpenCV表格图片寻找有效的x、y坐标并删除异常点

需求描述&#xff1a; 对表格图片&#xff0c;识别出表格里的横、纵坐标列表&#xff0c;并剔除异常点 解决方法&#xff1a; 通过opencv的getStructuringElement识别出横、竖线通过bitwise_and取得交点并去除表格线获取x和y的所有可能点&#xff0c;按照相邻点不超过阈值来筛…

6、JVM-JVM调优工具与实战

前置启动程序 事先启动一个web应用程序&#xff0c;用jps查看其进程id&#xff0c;接着用各种jdk自带命令优化应用 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jmap -histo 14660 #查看历史生成的实例 jmap -histo:live 14660 #查看当前存活的实…

Python程序设计 二维列表(二)

实验九 二维列表 1. 血压统计 血压的正常范围是 60mmHg<舒张压<90mmHg 90mmHg<收缩压<140mmHg 输入小张测量血压的日期&#xff0c;舒张压和收缩压&#xff0c;存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期&#xff0c;舒张…

OneFlow深度学习简介

介绍 OneFlow是一个基于深度学习的开源框架,主要面向机器学习工程师和研究人员。它提供了类似于其他深度学习框架(如TensorFlow和PyTorch)的API,同时具有高性能和高效的特点。OneFlow专注于在大规模数据集和分布式环境下的训练和推理,以及在生产环境中的部署和优化。其设计…

基于Java+SpringBoot+vue+node.js的图书购物商城系统详细设计和实现

基于JavaSpringBootvuenode.js的图书购物商城系统详细设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

GD32F3系列单片机环境搭建STM32CubeMX版

GD32单片机介绍 使用到开发板 GD32F303C-START 芯片型号&#xff1a;GD32F303CGT6 PinToPin单片机型号&#xff1a;STM32F103 GD32F303CGT6是超低开发预算需求并持续释放Cortex-M4高性能内核的卓越动力&#xff0c;为取代及提升传统的8位和16位产品解决方案&#xff0c;直接进…

ppt里的音乐哪里来的?

心血来潮&#xff0c;想照着大神的模板套一个类似于快闪的ppt。 ppt里是有一段音乐的&#xff0c;那段音乐就是从幻灯片第二页开始响起的。 但是我就找不到音乐在哪。 甚至我把ppt里的所有素材都删除了&#xff0c;再看动画窗格&#xff0c;仍然是空无一物&#xff0c;显然&…

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中&#xff0c;尽管已经为Oracle租户兼容了LOCK TABLE相关的语法&#xff0c;包括单表锁定操作&#xff0c;和WAIT N&#xff0c; NOWAIT 关键字。但使用时还存在一些限制。例如&#xff1a;LOCK TABLE只能针对单表进行锁定&#xff0c;并不…

OpenCV-AMF算法(自适应中值滤波Adaptive Median Filtering)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 实现原理 AMF&#xff08;Adaptive Median Filter&#xff0c;自适应中值滤波&#xff09;是一种用于图像处理和信号处理的滤波算…

腾讯云轻量应用服务器端口开启教程

腾讯云轻量应用服务器端口怎么打开&#xff1f;在轻量应用服务器控制台的防火墙中开启端口&#xff0c;本文腾讯云百科txybk.com以80端口为例&#xff0c;来详细说下轻量应用服务器端口打开教程&#xff0c;另外可以在腾讯云百科 txy.wiki 查看当前轻量服务器最新的优惠券和配置…

Angular学习第四天--问题记录及父子组件问题

问题一、 拉取完项目&#xff0c;使用npm install命令的时候遇到的。 解决办法&#xff1a; 在查找网上五花八门的解决方案之后&#xff0c;发现都不能解决。 我的解决办法是&#xff1a; 1. 把package-lock.json给删掉&#xff1b; 2. 把package.json中公司自己库的包给删除掉…