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

devtools/2024/9/23 1:05:28/

摘要

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

目录

摘要

一、空间布局图

二、代码测试一下

三、进程地址空间

四、测试代码


一、空间布局图

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

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

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

 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}

 


http://www.ppmy.cn/devtools/9653.html

相关文章

Vue3 Reactive和Ref

当你在使用Vue 3时&#xff0c;reactive 和 ref 是两个常用的响应式API。它们都是用来跟踪状态变化并在UI中进行响应式更新的。 1. ref ref 用于创建一个响应式的基本数据类型变量&#xff0c;例如数字、字符串等。它返回一个带有 .value 属性的对象&#xff0c;该属性包含了…

哈希表详解

目录 1.unordered系列关联式容器 2.哈希 3.unordered_map和unordered_set哈希实现 4.代码总和 1.unordered系列关联式容器 1.1unordered系列 c98的STL里面提供了底层为红黑树的关联式容器(set和map); 但是在结点数目很多的时候查询的效率就低了, 所以c11里STL又提供了四个…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

设计模式之原型模式

1、简单介绍 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有的实例来创建新对象&#xff0c;而不是通过调用类的构造函数来创建新实例。这种模式适用于需要快速复制大量相同或相似对象&#xff0c;或者创建对象需要消耗大量…

网络靶场实战-恶意程序自启动

简介 当恶意程序入侵目标为个人计算机时&#xff0c;相较于服务器&#xff0c;个人计算机对关机或重启操作更加频繁&#xff0c;关机时计算机所有的进程都会被结束&#xff0c;因此恶意程序需要配置自启动来使自己在每次开机时能够被运行。 本篇介绍一个恶意样本(b8090d7d12d…

LLM学习笔记-1

过往历史 ​​ 大体框架 手戳GPT2-small 一些概念 pytorch注意力机制(Transformer)LLM 过程 模型参数 GPT_CONFIG_124M {"vocab_size": 50257, # 词表大小"ctx_len": 1024, # 上下文长度"emb_dim": 768, # 嵌入维度"n…

HCIP-Datacom-ARST必选题库_23_SNMP【1道题】

一、单选 1.某中型规模园区网络通过SNMP协议管理网络,该园区对于网络安SNMP哪个版本进行管理? 所有版本均可以实现 BSNMPV1 SNMPV2C SNMPV3

【matlab】计算机控制系统设计

本文基于中国MOOC上东北大学的《计算机控制系统设计》&#xff0c;完成的课程笔记&#xff0c;并无原创想法。 一、概述 1.1 本课程所需掌握的基础知识 数学基础知识&#xff08;高等数学、复变函数、矩阵理论&#xff09;专业基础知识&#xff08;自动控制原理、微机原理、实…