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

进程--程序地址空间(引文)上篇

目录1.程序地址空间回顾具体作用和解释典型输出规律x86-64 Linux程序地址空间是内存吗1.程序地址空间回顾图1可是我们对他并不理解可以先对其进行各区域分布验证[user1iZ5waahoxw3q2bZ 26-4-24]$ cat code.c #include stdio.h #include unistd.h #include stdlib.h int g_unval; int g_val 100; int main(int argc, char *argv[], char *env[]) { const char *str helloworld; printf(code addr: %p\n, main); printf(init global addr: %p\n, g_val); printf(uninit global addr: %p\n, g_unval); static int test 10; char *heap_mem (char*)malloc(10); char *heap_mem1 (char*)malloc(10); char *heap_mem2 (char*)malloc(10); char *heap_mem3 (char*)malloc(10); printf(heap addr: %p\n, heap_mem); //heap_mem(0), heap_mem(1) printf(heap addr: %p\n, heap_mem1); //heap_mem(0), heap_mem(1) printf(heap addr: %p\n, heap_mem2); //heap_mem(0), heap_mem(1) printf(heap addr: %p\n, heap_mem3); //heap_mem(0), heap_mem(1) printf(test static addr: %p\n, test); //heap_mem(0), heap_mem(1) printf(stack addr: %p\n, heap_mem); //heap_mem(0), heap_mem(1) printf(stack addr: %p\n, heap_mem1); //heap_mem(0), heap_mem(1) printf(stack addr: %p\n, heap_mem2); //heap_mem(0), heap_mem(1) printf(stack addr: %p\n, heap_mem3); //heap_mem(0), heap_mem(1) printf(read only string addr: %p\n, str); for(int i 0 ;i argc; i) { printf(argv[%d]: %p\n, i, argv[i]); } for(int i 0; env[i]; i) { printf(env[%d]: %p\n, i, env[i]); } return 0; }[user1iZ5waahoxw3q2bZ 26-4-24]$ cat Makefile code:code.c gcc -o $ $^ -stdc99 .PHONY:clean clean: rm -f code [user1iZ5waahoxw3q2bZ 26-4-24]$ make gcc -o code code.c -stdc99[user1iZ5waahoxw3q2bZ 26-4-24]$ ./code code addr: 0x40055d 代码区 init global addr: 0x601034 已初始化区 uninit global addr: 0x601040 为初始化区 heap addr: 0x18b8010 堆区 heap addr: 0x18b8030 heap addr: 0x18b8050 heap addr: 0x18b8070 test static addr: 0x601038 静态局部变量 stack addr: 0x7ffd05093ef8 栈区 stack addr: 0x7ffd05093ef0 stack addr: 0x7ffd05093ee8 stack addr: 0x7ffd05093ee0 read only string addr: 0x400800 只读字符串地址 argv[0]: 0x7ffd050947f6 argv[0] 地址 env[0]: 0x7ffd050947fd 环境变量 地址 env[1]: 0x7ffd05094811 env[2]: 0x7ffd0509482a env[3]: 0x7ffd05094835 env[4]: 0x7ffd05094845 env[5]: 0x7ffd05094853 env[6]: 0x7ffd05094876 env[7]: 0x7ffd0509489e env[8]: 0x7ffd050948b1 env[9]: 0x7ffd050948bc env[10]: 0x7ffd05094e58 env[11]: 0x7ffd05094e73 env[12]: 0x7ffd05094ed1 env[13]: 0x7ffd05094efe env[14]: 0x7ffd05094f0f env[15]: 0x7ffd05094f26 env[16]: 0x7ffd05094f2e env[17]: 0x7ffd05094f3f env[18]: 0x7ffd05094f4d env[19]: 0x7ffd05094f82 env[20]: 0x7ffd05094fa5 env[21]: 0x7ffd05094fc4 env[22]: 0x7ffd05094fd0 env[23]: 0x7ffd05094fdc env[24]: 0x7ffd05094fe8这个程序的主要目的是观察和展示 Linux 进程中不同内存区域的地址分布。它通过打印各种变量、函数、动态分配内存、命令行参数、环境变量等的地址让我们直观地理解进程的虚拟地址空间布局如代码段、数据段、堆、栈、命令行参数和环境变量区等。具体作用和解释打印函数地址代码段printf(code addr: %p\n, main);→ 打印main函数的地址位于代码段.text。打印全局变量地址g_val是已初始化的全局变量位于数据段.data。g_unval是未初始化的全局变量位于 BSS 段.bss。二者都位于静态存储区。打印堆地址malloc分配的内存位于堆区。多次调用可以看到堆地址通常向上增长地址逐渐增大。打印静态局部变量地址static int test存放在静态存储区BSS 或数据段取决于是否初始化与全局变量相邻。打印栈地址局部变量heap_mem本身存放在栈上heap_mem打印的是栈地址。多个栈变量地址通常向下增长地址逐渐减小。打印只读字符串地址helloworld是字符串常量存放在只读数据段.rodata。打印命令行参数和环境变量地址argv[i]和env[i]指向的字符串位于进程启动时由内核布置在栈顶的命令行参数和环境变量区。典型输出规律x86-64 Linux运行程序后可以看到地址从低到高大致顺序取决于 ASLR代码段main地址最低。只读数据段字符串常量稍高。已初始化全局/静态g_val和未初始化全局/静态g_unval、test在数据段和 BSS 段地址介于代码段和堆之间。堆heap_mem等地址更高且连续分配时地址递增。栈heap_mem等地址最高通常位于堆之上且栈向下增长不同变量地址递减。命令行参数和环境变量的字符串位于栈顶附近地址可能与栈变量相近或更高。堆栈空间之间有一大段的镂空空间程序地址空间是内存吗---不是内存所以图一的那个是进程地址空间虚拟地址空间--它是一个系统的概念不是语言的概念证明不是物理内存[user1iZ5waahoxw3q2bZ 26-4-24]$ cat code.c #includestdio.h #includeunistd.h int gval 100; int main() { pid_t id fork(); if(id0) { while(1) { printf(子:gval:%d,gval:%p,pid:%d,ppid:%d\n,gval,gval,getpid(),getppid()); sleep(1); gval; } } else { while(1) { printf(父:gval:%d,gval:%p,pid:%d,ppid:%d\n,gval,gval,getpid(),getppid()); sleep(1); } } }[user1iZ5waahoxw3q2bZ 26-4-24]$ cat Makefile code:code.c gcc -o $ $^ .PHONY:clean clean: rm -f code [user1iZ5waahoxw3q2bZ 26-4-24]$ make gcc -o code code.c[user1iZ5waahoxw3q2bZ 26-4-24]$ ./code 父:gval:100,gval:0x60104c,pid:27204,ppid:26909 子:gval:100,gval:0x60104c,pid:27205,ppid:27204 父:gval:100,gval:0x60104c,pid:27204,ppid:26909 子:gval:101,gval:0x60104c,pid:27205,ppid:27204 父:gval:100,gval:0x60104c,pid:27204,ppid:26909 子:gval:102,gval:0x60104c,pid:27205,ppid:27204 子:gval:103,gval:0x60104c,pid:27205,ppid:27204 父:gval:100,gval:0x60104c,pid:27204,ppid:26909 子:gval:104,gval:0x60104c,pid:27205,ppid:27204 父:gval:100,gval:0x60104c,pid:27204,ppid:26909 子:gval:105,gval:0x60104c,pid:27205,ppid:27204 父:gval:100,gval:0x60104c,pid:27204,ppid:26909发现地址一样如果对应是内存地址出bug。---所以不是内存地址---虚拟地址C/C指针用到的地址全部都是虚拟地址所有语言在系统层面上都是虚拟地址期待我们下篇程序地址空间进程地址空间见

相关文章:

进程--程序地址空间(引文)上篇

目录 1.程序地址空间回顾 具体作用和解释 典型输出规律(x86-64 Linux) 程序地址空间:是内存吗? 1.程序地址空间回顾 图1 可是我们对他并不理解!可以先对其进行各区域分布验证: [user1iZ5waahoxw3q2b…...

UVM验证中的‘广播站’:深入理解analysis端口的一对多通信模型与实战

UVM验证中的‘广播站’:深入理解analysis端口的一对多通信模型与实战 想象一下城市里的广播电台——当主播的声音通过电波传出时,所有调频到这个频道的收音机都能同步接收相同的内容。在UVM验证环境中,uvm_analysis_port就扮演着类似的角色&a…...

QMCFLAC2MP3终极指南:如何快速将QQ音乐加密格式转换为通用MP3

QMCFLAC2MP3终极指南:如何快速将QQ音乐加密格式转换为通用MP3 【免费下载链接】qmcflac2mp3 直接将qmcflac文件转换成mp3文件,突破QQ音乐的格式限制 项目地址: https://gitcode.com/gh_mirrors/qm/qmcflac2mp3 QMCFLAC2MP3是一个专为解决QQ音乐格…...

STK可见性分析避坑指南:仰角、光照约束设置不当,你的卫星通信链路可能白算了

STK可见性分析避坑指南:仰角、光照约束设置不当,你的卫星通信链路可能白算了 在卫星通信和遥感任务中,精确计算可见性窗口是确保任务成功的关键。许多工程师在使用STK进行可见性分析时,往往只关注"无约束"条件下的计算结…...

企业级无线网络规划入门:如何用H3C AC为不同部门(业务/办公)配置隔离的Wi-Fi?

企业级无线网络规划实战:基于H3C AC的多部门Wi-Fi隔离方案 当走进一家现代化企业,你是否注意过不同区域的Wi-Fi名称可能各不相同?前台接待区显示"Guest-WiFi",会议室挂着"Meeting",而办公区则是&q…...

B站成分检测器:智能识别评论区用户身份,提升互动效率的终极指南

B站成分检测器:智能识别评论区用户身份,提升互动效率的终极指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comm…...

终极免费开源文本挖掘工具:KH Coder让多语言内容分析变得简单快速

终极免费开源文本挖掘工具:KH Coder让多语言内容分析变得简单快速 【免费下载链接】khcoder KH Coder: for Quantitative Content Analysis or Text Mining 项目地址: https://gitcode.com/gh_mirrors/kh/khcoder 开源文本挖掘软件KH Coder是功能强大的量化内…...

AMD EPYC服务器CPU选购与配置避坑指南:从NUMA架构看懂核心、内存通道与性能的关系

AMD EPYC服务器CPU选购与配置避坑指南:从NUMA架构看懂核心、内存通道与性能的关系 在数字化转型浪潮中,企业级服务器的选型直接关系到业务系统的稳定性和性能表现。作为近年来服务器市场的明星产品,AMD EPYC系列处理器凭借卓越的多核性能和能…...

如何永久掌控你的数字记忆:WeChatMsg终极数据主权指南

如何永久掌控你的数字记忆:WeChatMsg终极数据主权指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

3个BsMax终极技巧:让3ds Max用户无缝切换到Blender的高效工作流

3个BsMax终极技巧:让3ds Max用户无缝切换到Blender的高效工作流 【免费下载链接】BsMax BsMax Blender Addon (UI simulator/ Modeling/ Rigg & Animation/ Render Tools and ... 项目地址: https://gitcode.com/gh_mirrors/bs/BsMax 对于长期使用3ds Ma…...

告别Autojs!手把手教你用VSCode+Autox.js搭建手机自动化脚本开发环境(附Scrcpy投屏)

从Auto.js到Autox.js:打造专业级手机自动化开发环境全指南 在移动互联网时代,自动化脚本已成为提升工作效率的利器。对于熟悉Auto.js的开发者来说,Autox.js作为其开源继承者,不仅延续了简洁高效的特性,还提供了更稳定…...

如何快速掌握SetDPI:Windows多显示器DPI缩放终极解决方案

如何快速掌握SetDPI:Windows多显示器DPI缩放终极解决方案 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 还在为多显示器显示效果不一致而烦恼吗?SetDPI是一款简单高效的Windows命令行工具,专门解决多…...

告别浏览器书签孤岛:用Floccus+坚果云实现跨平台同步(保姆级图文教程)

跨平台书签同步实战:Floccus与坚果云的完美组合 你是否经常遇到这样的困扰:在公司电脑的Chrome浏览器收藏了一个重要网页,回到家想在个人电脑的Firefox上查看时却找不到?或者手机浏览器上保存的书签无法在办公电脑上快速访问&…...

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

从零开始用Protege构建知识图谱:手把手实战指南 第一次打开Protege时,满屏的专业术语和复杂界面确实容易让人望而却步。但别担心,本文将带你像拼乐高一样,一步步搭建出你的第一个知识图谱。我们以"中国古代文人关系网"…...

告别Anaconda Navigator:用纯命令行在Windows 11上快速搭建Superset虚拟环境

告别Anaconda Navigator:用纯命令行在Windows 11上快速搭建Superset虚拟环境 对于追求效率的技术团队而言,数据可视化平台的部署速度直接影响分析效率。Apache Superset作为Airbnb开源的现代BI工具,以其丰富的可视化类型和灵活的权限管理著称…...

基于mediapipe的人体姿态识别+康复训练矫正+体育动作姿态识别(AI 健身教练来分析深蹲等姿态)

姿态识别康复训练矫正(AI 健身教练姿态分析) 目录 本文旨在构建一个 AI 健身教练,帮助判断姿态标准与否,并且矫正姿态!无论您是初学者还是专业人士,它都可以帮助您无缝地进行深蹲。为了完成这项任务&…...

Nucleus Co-Op终极指南:如何为任何单机游戏添加本地分屏多人功能

Nucleus Co-Op终极指南:如何为任何单机游戏添加本地分屏多人功能 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经想过和朋友…...

GitHub Copilot:AI编程助手的核心功能与实战技巧

1. 开发者生产力的新纪元:GitHub Copilot 初探作为一名在代码堆里摸爬滚打多年的老程序员,我至今记得第一次用GitHub Copilot时那种"这玩意儿居然能读懂我心思"的震撼。它不只是一个智能补全工具,更像是坐在你肩膀上的编程助手&…...

R语言空间分析、模拟预测与可视化高级应用

随着地理信息系统(GIS)和大尺度研究的发展,空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用,其中在空间分析方面扮演着重要角色,与空间相关的包的数量也达到130多个。在本…...

2026年主流面试录音转写工具大横评抗噪与转写准确率实测对比,差距竟然这么大,谁才是王者

对比了多款主流面试录音转写工具,听脑AI是综合体验最好的,不管是抗噪能力、转写准确率还是性价比,都比我试过的其他工具好出一大截,刚好最近很多HR朋友问我面试整理用什么工具,把我这次实测的结果分享给大家。 直达链…...

从手机芯片到智能手表:拆解CMOS反相器如何成为现代低功耗芯片的‘基石单元’

从手机芯片到智能手表:拆解CMOS反相器如何成为现代低功耗芯片的‘基石单元’ 在智能手表续航突破30天的宣传海报上,很少有人会注意到一个关键数字:芯片待机功耗仅0.5毫瓦。这背后隐藏着一个持续半个世纪的技术进化——CMOS反相器电路如何从实…...

全能资源网站:咖喱君的资源库

分享一个涵盖学习、软件、影音、AI 等全场景资源的免费宝藏网站,帮你一站式解决绝大多数资源需求。——咖喱君的资源库(https://link3.cc/galijun)...

ESP32-S3 LED控制器YULC的硬件设计与智能家居应用

1. YULC USB-C LED控制器深度解析作为一名智能家居设备开发者,我最近测试了AAElectronics推出的YULC USB-C LED控制器。这款基于ESP32-S3的控制器完美解决了LED灯带项目中的三大痛点:供电混乱、信号衰减和系统集成。相比市面上常见的控制器方案&#xff…...

LinkSwift网盘直链下载助手:八大网盘高速下载终极指南

LinkSwift网盘直链下载助手:八大网盘高速下载终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

AEUX终极指南:5分钟完成Figma/Sketch到After Effects的无缝设计转换

AEUX终极指南:5分钟完成Figma/Sketch到After Effects的无缝设计转换 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 想象一下,你在Figma或Sketch中精心设计的界面…...

别再傻傻下载几十G源码了!这5个在线工具让你秒查Android系统源码(附优缺点对比)

高效查阅Android系统源码的5个在线工具全解析 作为一名长期与Android系统打交道的开发者,我深刻理解查阅系统源码时的痛点——动辄几十GB的源码下载不仅耗时耗力,还会占用宝贵的本地存储空间。更不用说不同版本间的切换和源码索引的维护,这些…...

输入法词库转换终极指南:轻松实现20+输入法词库迁移

输入法词库转换终极指南:轻松实现20输入法词库迁移 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法时丢失个人词库而烦恼吗?…...

算术编码 vs. 哈夫曼编码:图像压缩实战中到底该选谁?

算术编码 vs. 哈夫曼编码:图像压缩实战中到底该选谁? 在数字图像处理领域,数据压缩技术始终扮演着关键角色。面对海量图像数据的存储与传输需求,工程师们常常需要在算术编码和哈夫曼编码这两种经典熵编码方案之间做出选择。本文将…...

如何用AI相册打造你的个人数字记忆库:行影集完整指南

如何用AI相册打造你的个人数字记忆库:行影集完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChat…...

终极Photoshop AI插件SD-PPP完整指南:如何让AI绘图与设计完美融合

终极Photoshop AI插件SD-PPP完整指南:如何让AI绘图与设计完美融合 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP是一款革命性的Photoshop AI插件,它彻底改变了设计师与AI协作的工作…...