深入了解C++:底层编译原理

进程的虚拟空间划分

任何编程语言,都会产生两样东西,指令和数据。

.exe程序运行的时候会从磁盘被加载到内存中,但是不能直接加载到物理内存中。Linux会给当前进程分配一块空间,比如x86 32位linux环境下会给进程分配2^32(4G)大小的空间,这个空间被叫做【进程的虚拟地址空间】,进程的虚拟地址空间其实并不存在,从底层来看它不过是内核创建的一系列数据结构而已。

以x86 32位linux为例,讲解进程的虚拟地址空间:这部分空间默认首地址是0x00000000,尾地址是0xFFFFFFFF,以0xCCCCCCCC为界被划分为两块,0x00000000~0xCCCCCCCC是【用户空间】,0xCCCCCCCC~0xFFFFFFFF是【内核空间】。

用户空间被进一步划分,0x00000000~0x08048000是不允许访问的空间。往后就是.【text段】,用于存储程序的机器代码(即已编译的指令),其中还有一部分是,rodata段(readonly data),用于存放只读数据(比如char *p=“hello”,所以不能修改)。

再往下就是.data段(专门存放初始化并且初始化不为0的数据),和.bss段(存放未初始化和初始化为0的数据),.bss段会自动把放入的数据做0初始化。最终生成的可执行文件就已经包含了./data段和./bss段里的数据了。

再往下就是.head段,俗称堆内存。

再往下就是共享库空间,用于加载.dll,.so等文件。

再往下就是stack段,俗称栈空间。栈是从高地址往低地址增长,堆是从低地址往高地址增长。栈空间在运行到相应的指令的时候才会被使用。

最后存放命令行参数和环境变量。

内核空间被划分为ZONE_DMA(16M左右),ZONE_NORMAL(800M左右,存放了各种控制块,比如tcb),ZONE_HIGHMEM(地址映射用)

注意:每一个进程用户空间是私有的,内核空间是共享的!所以进程之间通信需要通过内核空间。

#include<stdio.h>//可执行文件展开的时候
//这些数据都被直接放入相应的./data或./bss段
int gdata1 = 0; //.data
int gdata2 = 0;//.bss
int gdata3;//.bssstatic int gdata4 = 1; //.ata
static int gdata5 = 0;//.bss
static int gdata6;//.bssint main(){//编译的时候产生的是指令,//可执行问价展开的时候放在.text中,//指令运行的时候才会再栈上开辟空间int a =12;int b =0;int c;//同.data或.bssstatic int c =13;static int f =0;static int g;return 0;
}

函数调用堆栈空间的过程

下面用一段很简单的代码说明栈堆调用过程。

#include <iostream>
using namespace std;int sum(int a,int b)
{int temp = 0;temp = a + b;return temp;
}int main()
{int a = 10;int b = 20;int ret = sum(a,b);cout << ret <<endl;return 0;
}

我们知道函数运行的时候需要在栈上开辟一块栈桢,.text里的汇编指令运行的时候,会往栈帧里写入相关数据。 比如int a = 10对应的指令运行的时候,会对main函数的栈帧进行压栈,从ebp(栈底)压入了a=10这个数据。

运行上述代码会依次发生以下事情:

1、ebp指针指向main栈帧的栈底,esp指针指向main栈帧的栈顶。esp和ebp指向的是当前调用的栈帧,能表示一块空间。

2、a、b、ret会依次从ebp压入main函数的栈帧中。

3、sum函数的实参会从右往左依次从esp(栈顶压入)。注意,栈帧的大小是会动态变化的,esp会保持位移一直指向栈帧的顶部。

4、把下一指令,也就是sum函数的指令的地址跟从实参地址一起从esp方向压入栈帧中。

5、把main函数调用的地址跟从sum函数调用的地址一起从esp方向压入栈帧中。

6、给sum函数开辟栈帧空间,ebp赋值成esp后,esp指向sum栈帧的顶部。sum函数栈帧可能会被初始化成0xCCCCCCCC。

7、给sum函数的栈帧空间从ebp压入temp。

8、计算a+b的值并赋值给temp空间。

9、回退栈帧,让ebp获取pop出的栈值,所以能重新指向main函数的栈底。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3页面跳转产生白屏,刷新后能正常展示的解决方案

可以依次检查以下问题&#xff1a; 1.是否在根组件标签最外层包含了个最大的div盒子包裹内容。 2.看看是否在template标签下面直接有注释&#xff0c;如果有需要把注释写到div里面。&#xff08;即根标签下不要直接有注释&#xff09; 3.在router-view 中给路由添加key标识。 …

(附源码)ssm 招聘信息管理系统-计算机毕设 78049

ssm 招聘客户管理系统 摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的…

脚本工具 mktemp 和 install

1.创建临时文件 mktemp 1.1 介绍 mktemp 命令用于创建并显示临时文件&#xff0c;可避免冲突 使用mktemp命令时&#xff0c;它会根据指定的模板在临时目录&#xff08;默认为/tmp&#xff09;中创建一个唯一的临时文件或目录&#xff0c;并返回该文件或目录的完整路径。临时…

在线UI设计工具有哪些?这5个包你满意

随着 UI 设计行业的蓬勃发展&#xff0c;越来越多的设计师进入 UI 设计&#xff0c;选择一款方便的 UI 设计工具尤为重要&#xff01;除了传统的 UI 设计工具&#xff0c;在线 UI 设计工具也受到越来越多设计师的青睐。这种不受时间、地点和计算机配置限制的工作方法真的很刺激…

Python处理图片生成天际线(2024.1.29)

1、天际线简介 天际线&#xff08;SkyLine&#xff09;顾名思义就是天空与地面的边界线&#xff0c;人站在不同的高度&#xff0c;会看到不同的景色和地平线&#xff0c;天空与地面建筑物分离的标记线&#xff0c;不得不说&#xff0c;每天抬头仰望天空&#xff0c;相信大家都可…

屈子祠镇黑鱼岭,不可移动文物预防性保护系统守遗珍

一、何止秦俑 秦陵苑囿青铜水禽等文物集中展出 文物保护&#xff0c;尤其是不可移动文物的保护&#xff0c;一直都是文化遗产的重要环节。湖南省汨罗市屈子祠镇双楚村黑鱼岭墓地&#xff0c;作为长江中游地区的重大考古发现&#xff0c;其商朝晚期的历史背景赋予其不可估量的历…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-6 绘制几何图形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>绘制几何图形</title> </head><body><canvas id"canvas" width"250" height"150" style"border: 1px b…

QUIC with CUBIC or BBR

拥塞控制 拥塞控制算法是 TCP/QUIC 协议的一个基础部分&#xff0c;多年来经过一个个版本的迭代&#xff08;如 Tahoe、Reno、Vegas 等&#xff09;&#xff0c;拥塞控制算法得到了持续的提升。由于篇幅有限&#xff0c;本文就目前比较流行的两种拥塞控制算法&#xff08;CUBI…

SVM支持向量机

1.基本概念 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种有监督学习方法&#xff0c;主要用于分类和回归分析。它的基本思想是在特征空间中找到一个超平面&#xff0c;能够将不同类别的样本分开&#xff0c;并且使得离这个超平面最近的样本…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到&#xff0c;如果正确会i显示you are in&#xff0c;错误则无任何提示&#xff0c;由此可以判断出&#xff0c;目前只显示对错&#xff0c;此外前端不会显示任何数据 也就是说&#xff0c;目前结果只有两种&#xff0c;在这种只有两种变量的…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

上位机是什么?与下位机是什么关系

在工业自动化领域中&#xff0c;上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇&#xff0c;想要深入了解其在工业智能中的作用。那么&#xff0c;上位机究竟是什么呢&#xff1f; 首先&#xff0c;上位机是一种用于工业控制系统的软件应用&#xff0c;通常…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

STM32G4单片机

单片机的基本结构 CPU就是中央处理器&#xff0c;是单片机的内核 时钟电路&#xff0c;时钟源是给整个电路提供时序 其他的外设、中断以及存储器都是通过系统总线与CPU进行连接 RAM相当于电脑的内存条&#xff0c;随机存储器&#xff0c;掉电会丢失 ROM相当于电脑的硬盘&am…

美籍华裔力学和数学家林家翘

林家翘&#xff08;1916年7月7日—2013年1月13日&#xff09;&#xff0c;出生于北京&#xff0c;男&#xff0c;原籍福建福州&#xff0c;力学和数学家&#xff0c;美国艺术与科学院院士、美国国家科学院院士、中国科学院外籍院士&#xff0c;麻省理工学院荣誉退休教授 [1]。 …

初始MySQL

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

服务网格(Service Mesh)流行工具

在这篇博客中&#xff0c;我们将介绍微服务的最佳服务网格工具列表&#xff0c;这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中&#xff0c;我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

【Eclipse平台】2 Eclipse Workbench工作台介绍

Eclipse Workbench工作台介绍 本文介绍Eclipse工作台Workbench。 当工作台启动时&#xff0c;首先看到的是一个对话框&#xff0c;该对话框允许我们选择工作区的位置。工作区是存储工作的目录。现在&#xff0c;只需单击“确定”即可选择默认位置。 选择工作区位置后&#x…

如何访问 Oracle OKE 集群

OKE是Oracle Cloud提供的托管Kubernetes服务&#xff0c;为用户提供强大而灵活的容器编排平台。在本文中&#xff0c;我们将详细介绍如何有效地与OKE集群进行交互&#xff0c;包括访问集群的不同方式、管理访问权限以及执行常见操作的步骤。 1 安装oci命令 1.1 在Oracle Linux…