【Linux】地址空间

本片博客将重点回答三个问题
什么是地址空间?
地址空间是如何设计的?
为什么要有地址空间?
程序地址空间排布图
在32位下,一个进程的地址空间,取值范围是0x0000 0000~ 0xFFFF FFFF

回答三个问题之前我们先来证明地址空间排布是按如图所布局的
各个区空间地址验证代码
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int g_unval; // 未初始化数据
int g_val = 100; // 初始化数据,一般指全局初始化数据
int main(int argc, char* argv[], char* env[]) // 命令行参数,环境变量
{// 代码地址打印 printf("code addr: %p\n", main); printf("init global addr: %p\n", &g_val);printf("uninit global addr: %p\n", &g_unval);// 堆区,指针变量本质是变量,也要开辟空间,不过放的内容是地址char *heap_mem = (char*)malloc(10);printf("heap addr: %p\n", heap_mem);// 栈区,函数内定义的变量都是在栈上开辟空间printf("stack addr: %p\n", &heap_mem); int i = 0;for (i = 0; i < argc; i++){ // 命令行参数地址 printf("argv[%d]: %p\n", i, argv[i]);}int j = 0;for (j = 0; env[j]; j++){printf("env[%d]: %p\n", j, env[j]);}return 0;}
运行结果

堆、栈之间的两个箭头表示
栈向地址减小的方向增长
堆向地址增大的方向增长

证明方法也很简单

运行结果也证明确实是这样
我们会发现堆区之间差了20字节
我们平时申请空间,系统会多给你一些空间
多出的空间用来记录你堆的属性信息
所以平时我们free空间,只要传起始地址
剩下的系统知道要free多长的空间

我们在系统部分要记的两个口诀
1、先描述在组织
2、堆、栈相对而生
static 修饰局部变量,本质就是将该变量开辟在全局区域
所有的字面常量将来都是要映编码进代码的
在正文代码上其实有一小段是字符常量区

什么是地址空间以及是如何设计的
我们平时打印各种地址其实就是进程打印,程序运行之后打印的
在解释什么是地址空间之前,我们先来讲一个故事
有一个富豪,他有5亿元家产
他有3个私生子,彼此并不知道对方存在
3个私生子分别叫张三、李四、王五
富豪为了鼓励3个儿子
对张三说你好好念书将来5亿就是你的了
对另外两个儿子也说了同样的话
因为不知道彼此存在
对于这三个儿子,他们都认为是5亿继承人
富豪给他们每一个儿子画了一个大饼
有一天,张三对他爸说要1千买学习资料
李四说我成年了想买一辆两百万的跑车
王五说我创业需要50万
富豪都给了他们需要的钱
只要他们要钱富豪都会给
有一天张三说要1亿,富豪说要这么多干嘛
拒绝了张三,即使被拒绝了张三依旧认为自己是5亿的继承人
我们站在上帝视角知道即使富豪过世了
这三个儿子不可能都拥有5亿
他们每个儿子可以断断续续的要钱
但永远要不到5亿,却依然坚信自己以后能拥有这5亿
对应关系
富豪 ---- 操作系统
儿子 ---- 进程
富豪画的饼 ---- 地址空间
在内存中的地址空间本质是一种数据结构
将来要和一个特定的进程关联起来
以前直接访问物理内存,如果有野指针的问题
可能直接访问到其他进程
内存本身是随时可以被读写
所以在老式的程序里面野指针是会直接改了其他进程的东西
结论:直接使用物理内存不安全
现代计算机的解决方式
每个进程有自己的PCB
操作系统给每个进程一个虚拟的地址空间
通过映射机制映射到物理内存
我们可能会有疑问,最终还是会访问物理内存
万一虚拟地址是一个非法地址呢
其实映射机制有一个检查机制,万一是非法地址
可以不让你映射

虚拟地址空间究竟是什么?
每个进程都要有地址空间
就好比操作系统要给每个进程画个饼
操作系统要给每个饼做管理
在内存中的地址空间本质是一种内核数据结构
它里面至少有各个区域的划分

我们把如图结构称为地址空间
区域空间并不是死的,会有一定的变化
所谓的范围变化,本质是对start 或end 标记值 + - 特定的范围即可

所以一个地址为什么有两个值
到这里就可以回答这个问题了
刚开始创建时只有父进程
然后创建子进程,子进程会继承父进程的属性
所以子进程的页表、地址空间和父进程一样
当子进程尝试修改变量值时
因为要保证进程的独立性
操作系统会重新为子进程,开辟一份物理内存
并修改子进程页表的映射关系
但是虚拟地址并不受影响,还是一样的地址
但映射到物理内存的不同区域
看到的值便不一样
这种策略就叫作写时拷贝

为什么要存在地址空间
- 保护物理内存
凡是非法的访问或者映射,
os都会识别到,并且终止你这个进程
因为地址空间和页表是os创建并维护的
也就意味着凡是想使用地址空间和页表
进行映射,也一定要在OS的监管下进行访问 - OS耦合度更低
因为有地址空间的存在
因为有页表映射的存在
我们的物理内存就可以
对未来的数据进行任意位置的加载
物理内存的分配就可以和
进程的管理互不关联
从而使内存管理模块和进程管理模块
完成解耦合
我们在C、C++语言上new、malloc空间时
本质是在虚拟地址空间申请的
因为有地址空间的存在,所以上层申请空间
物理内存可以甚至一个字节都不给你
当你真正访问物理地址时,才执行
内存相关算法,帮你申请内存,构建
页表映射关系,这样空间使用率为100%
以此提高整机效率
- 保证进程的独立性
因为有地址空间的存在,每一个进程
都认为自己拥有4GB的空间(32)
并且各个区域是有序的,进而
可以通过页表映射到不同的区域
来实现进程的独立性,每一个进程
不知道,也不需要知道其他进程的存在
重新理解什么是挂起?
加载的本质就是创建进程,但并不是
非得把所有程序的代码和数据加载到
内存中,并创建内核数据结构建立映射关系
在极端情况下,只有内核结构被创建
此时就叫新建状态
理论上,可以实现对程序的分批加载
既然可以分批加载,自然可以分批换出
一个进程短时间不会被执行,比如阻塞
而使进程的数据和代码被换出就叫挂起
页表不仅仅映射物理内存
磁盘位置也可以映射
所以当代码挂起时,不用把数据
刷新到磁盘里。只要把空间直接释放掉,
在页表重新填上磁盘当中代码和数据的
位置,就可以完成一次基本的挂起
扩展知识
在vim中注释
Ctrl + v 进入视图模式(V-BLOCK)
hjkl 选中需要注释代码
输入大写的i,左下角出现INSERT
输入 // ,再按esc 自动注释选中的代码
取消注释还是上面的操作
选中需要注释的代码,按d删除
✨✨✨✨✨
本篇博客完,感谢阅读🌹🌹🌹
如有错误之处可评论指出,博主会耐心听取每条意见
相关文章:
【Linux】地址空间
本片博客将重点回答三个问题 什么是地址空间? 地址空间是如何设计的? 为什么要有地址空间? 程序地址空间排布图 在32位下,一个进程的地址空间,取值范围是0x0000 0000~ 0xFFFF FFFF 回答三个问题之前我们先来证明地址空…...
作为一个产品经理带你了解Axure的安装和基本使用
1.Axure的简介 Axure是一种强大的原型设计工具,它允许用户创建交互式的、高保真度的原型,以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型,以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…...
接口测试总结及其用例设计方法
接口测试的总结文档 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分:主要介绍…...
2023团体程序设计天梯赛——模拟赛和总决赛题
M-L1-1 嫑废话上代码 Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一行中输出…...
智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.参考…...
视频中自监督学习:「我的世界」下指令理解与跟随
本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展,题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 GROOT 该研究的核心目标是探索能否摆脱文本数据的标…...
Spring基于xml半注解开发
目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置,使用Component注解替代<bean>标签中的id以及class属性,而对…...
功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?
软件测试是一个广义的概念,他包括了多领域的测试内容,比如,很多新手可能都听说:功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试等&#…...
oracle 下载java之前版本
登录oracle官网:Oracle | Cloud Applications and Cloud Platform 点击resource 进入该页面 点击这个 出现之前版本...
LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent
AgentGPT是一个自主人工智能Agent平台,用户只需要为Agent指定一个名称和目标,就可以在浏览器中链接大型语言模型(如GPT-4)来创建和部署Agent平台。 PS:目前agentGPT仅支持chatgpt模型,暂时不支持本地llm模…...
AGM离线下载器使用说明
AGM专用离线下载器示意图: 供电方式: 通过 USB 接口给下载器供电,跳线 JP 断开。如果客户 PCB 的 JTAG 口不能提供 3.3V 电源,或仅需烧写下载器,尚未连接用户 PCB 时,采用此种方式供电。 或者:…...
viple与物理机器人(一):线控模拟
为了检测viple程序与物理机器人是否能顺利连接上 如果能顺利连接上,那么,可以通过内建事件从而控制物理机器人的前进、后退、左转、右转以及暂停。 如果不能连接上,首先,程序无法控制物理机器人,其次,当vip…...
Appium 并行测试多个设备
一、前置说明 在自动化测试中,经常需要验证多台设备的兼容性,Appium可以用同一套测试运例并行测试多个设备,以达到验证兼容性的目的。 解决思路: 查找已连接的所有设备;为每台设备启动相应的Appium Server;…...
高防IP是什么? 防护CC 对抗DDOS
什么是DDoS高防IP? DDoS(分布式拒绝服务)攻击是指攻击者通过利用大量恶意流量向目标服务器发送请求,导致目标服务器无法正常处理合法用户的请求。DDoS高防IP是一种通过技术手段来应对DDoS攻击的解决方案。它能够过滤掉恶意流量&a…...
使用消息队列遇到的问题—kafka
目录 1 分区2 消费者3 Kafka 如何保证消息的消费顺序?3.1 方案一3.2 方案二 4 消息积压 在项目中使用kafka作为消息队列,核心工作是创建生产者—包装数据;创建消费者----包装数据。 欠缺一些思考,特此梳理项目中使用kafka遇到的一…...
Linux系统---基于Pipe实现一个简单Client-Server system
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 Server是一个服务器进程,只能进行整数平方运算。Client要计算一个整数的平方的平方的平方,即…...
CentOS7安装最新版本git
CentOS7上的git是1.8.3.1,比较老,使用体验不好。下载源码来升级一下。 sudo yum -y install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel sudo yum -y iinstall asciidoc xmlto docbook2X sudo yum -y in…...
Java项目-瑞吉外卖Day3
填充公共字段: 目的:由于某些属性,例如createdTime这些需要填充的字段会在多个地方出现,所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略,是插入/更新的时候…...
Java集合框架之争:ArrayList vs LinkedList
友情提示:LinkedList其实就是数据结构中的双向链表,没学过的话可以学一下有关链表的知识,至于LinkedList中的源码其实大多数据结构的基本链表操作实现的,这里我就不多做说明了,有兴趣的话可自行看源码 由于ArrayList由…...
一个用于处理嵌入式系统中的 NAND Flash 存储器的工具 `kobs-ng`
一个用于处理嵌入式系统中的 NAND Flash 存储器的工具 kobs-ng kobs-ng 是一个用于处理嵌入式系统中的 NAND Flash 存储器的工具。它是 U-Boot(开源引导加载程序)中的一个子项目,用于擦除、写入和读取 NAND Flash 设备上的数据。 以下是 kob…...
CPAL脚本自动化测试 ———— 深度解析Test Report系列函数与应用场景
1. 为什么我们需要定制化测试报告? 在车载网络测试领域,特别是涉及自动驾驶功能的验证时,一个标准的测试报告往往无法满足工程师的需求。想象一下,当你花了三天三夜跑完2000个测试用例后,拿到的报告却只有简单的"…...
提升效率:用快马一键生成模块化openclaw控制代码库
最近在做一个机器人项目,需要控制openclaw机械爪完成各种抓取任务。刚开始自己从头写控制代码时,发现光是启动流程就要处理一堆底层细节,比如初始化通信、校准位置、设置默认参数等等,不仅重复劳动,还容易出错。后来尝…...
My SQL 数据库基础实例教程(第二单元学习笔记)
2.1关系数据库设计2.1.1 数据的加工1.现实世界现实世界是指客观存在的事物及他们相互之间的联系。2.信息世界信息世界是人们把现实世界的信息和联系通过“符号”记录下来,然后用规范化的数据库定义语言来描述而构成的一个抽象世界。3.计算机世界计算机世界将信息世界…...
Mac开发者必备:OpenClaw联动千问3.5-27B实现代码审查自动化
Mac开发者必备:OpenClaw联动千问3.5-27B实现代码审查自动化 1. 为什么需要代码审查自动化? 作为独立开发者,我经常面临一个尴尬局面:在深夜提交代码后,第二天才发现引入了低级语法错误或潜在漏洞。传统CI工具虽然能捕…...
wUU代码混淆实战指南:使用Obfuscar构建坚不可摧的安全防线
在当今数字化时代,保护.NET应用程序的源代码安全变得尤为重要。你是否担心自己的知识产权被轻易窃取?是否希望防止竞争对手通过反编译分析你的核心业务逻辑?今天,我将为你详细介绍一款强大的开源混淆工具——Obfuscar,…...
SEO_网站SEO排名下降的五大原因及应对技巧
SEO:网站SEO排名下降的五大原因及应对技巧 在数字营销的世界里,网站的SEO排名对于吸引流量和提升业务是至关重要的。随着搜索引擎算法的不断更新,很多网站会经历SEO排名下降的困境。本文将详细探讨网站SEO排名下降的五大原因,并提供相应的应…...
解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南
解锁Windows效率提升:免费工具Winhance-zh_CN全功能指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...
解决Python文件路径超长问题:Windows系统下的终极指南
解决Python文件路径超长问题:Windows系统下的终极指南 在Windows平台上开发Python应用时,文件路径长度限制是个令人头疼的"历史遗留问题"。记得第一次接手一个大型Python项目时,我花了整整两天时间才搞明白为什么某些文件总是无法读…...
告别手动转换!用Python自动化处理CSV到Little_R的完整指南
告别手动转换!用Python自动化处理CSV到Little_R的完整指南 在数据科学和机器学习领域,数据格式转换是一项频繁且耗时的任务。特别是当我们需要将常见的CSV格式转换为特定领域专用的Little_R格式时,手动操作不仅效率低下,还容易出错…...
毫米波雷达数据处理避坑指南:AWR2243的complex1x与complex2x格式到底怎么选?
毫米波雷达数据格式深度解析:AWR2243的complex1x与complex2x实战选择策略 在毫米波雷达信号处理的实际工程中,ADC数据格式的选择往往被当作一个简单的配置参数,直到工程师们在后期信号处理阶段遇到难以解释的噪声问题或成像质量下降时&#x…...
