从汇编层看64位程序运行——程序中的栈(Stack)结构及其产生的历史原因

news2024/9/27 5:10:31

大纲

  • 传统栈
  • 程序栈
  • X86体系栈
  • 反向的原因
  • 参考资料

如果要讲程序在系统层的运行,一个绕不开的名词就是“栈”。所以深入理解“栈”是这个系列重要的基础。本文也将深入浅出,只讲明白程序运行中使用的栈是什么。

传统栈

有计算机基础的同学都知道栈的特点:先进后出的有序结构。比如我们按顺序将1,2,3压入(push)栈,只能按3,2,1的顺序将数据从栈中弹出(pop)。
在这里插入图片描述

程序栈

但是对于运行在系统上的程序,操作系统并不会如上图物理性的搬运栈上元素,而是一开始就统一分配了一定大小的连续空间作为栈。
在我的开发环境Ubuntu22TLS上,默认的程序所拥有的栈大小是8192kbytes,即8MB。
我们可以通过下面的这个命令来查看

ulimit -a | grep stack

stack size (kbytes, -s) 8192

在这里插入图片描述
那这个连续的内存如何做到栈的特点,即有入栈和出栈的行为呢?
当一个问题不能解决的时候,我们就可以通过引入一个中间层来解决。
很容易想到,我们可以通过一个指向该连续空间中某个位置的指针来实现出入栈。
在这里插入图片描述

X86体系栈

以上只是理论性的讲解,而现实中,我们对栈的理解要“换个角度”。
怎么换“角度”?要反过来看。
在X86体系架构中,栈是反着的。如下图,栈的底部位于“上方”,栈的顶部位于“下方”。
在这里插入图片描述
那评判“上方”或者“下方”的标准是什么?是地址大小。
在这里插入图片描述
所以需要记住以下几点:

  • 在X86体系下,栈是“反向”的。
  • 栈的底部(上)地址值大,栈的顶部(下)地址值小。
  • 栈在增长(Push),则其栈顶地址在减小。栈在回退(Pop),则其栈顶地址在增大。

反向的原因

如果不去看计算机发展的历史,很难想象为什么早期的计算机科学家会做出如此反常的设计。现在我们假想自己回到计算机早期设计阶段,会面对什么样的问题,以及如何解决。
我们知道,和“栈”对应的结构是“堆”。我们平时经常将“堆栈”放在一起来描述计算机一些原理。
堆栈就是用于动态保存程序运行时数据的结构。如果我们要在内存中给它们分配空间,肯定需要考虑一个问题:

  • 如何尽量大的利用内存?

一种比较简单的想法就是:堆和栈用一块内存空间,即它们相连,但是又要有一个明显的间隔。这个间隔区分了堆和栈,以防止数据污染。
上述我们讲过,栈的大小是固定的(默认8MB)。这个大小就帮助“间隔”的产生。
于是存在下面两种可能:

  • 栈在顶部,堆在底部。
  • 栈在底部,堆在顶部。
    在这里插入图片描述
    这两个设计没有本质性的区别。但是最终早期的计算机科学家选择了栈在顶部、堆在底部的设计。
    这样的设计,就意味着:
  • 栈的底部是高地址空间,栈的增长方向是向下(向低地址空间发展)。
  • 堆的底部是低地址空间,堆的增长方向是向上(向高地址空间发展)。

如下图,是我们未来要讲解的一个例子。rbp是栈帧的栈底指针寄存器,rsp是栈帧的栈顶指针寄存器。可以看到rbp比rsp的值要大,即栈底的地址大于栈顶的地址。
在这里插入图片描述

参考资料

  • https://stackoverflow.com/questions/4560720/why-does-the-stack-address-grow-towards-decreasing-memory-addresses

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

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

相关文章

开源浏览器引擎对比与适用场景:WebKit、Chrome、Gecko

WebKit与Chrome的Blink引擎对比 起源与关系: WebKit最初由苹果公司开发,用于Safari浏览器。后来,WebKit逐渐成为一个独立的开源项目,被多个浏览器厂商采用。Blink是Google基于WebKit项目分支出来的一个浏览器引擎,用于…

实现Android夜间模式主题:从入门到精通

实现Android夜间模式主题:从入门到精通 随着用户对夜间模式的需求越来越高,Android开发者需要掌握如何在应用中实现夜间模式。本文将详细介绍在Android中实现夜间模式的步骤,包括配置、实现、以及一些最佳实践,帮助开发者创建更具吸引力和用户友好的应用。 夜间模式的优势…

文献翻译与阅读《Integration Approaches for Heterogeneous Big Data: A Survey》

CYBERNETICS AND INFORMATION TECHNOLOGIES’24 论文原文下载地址:原文下载 目录 1 引言 2 大数据概述 3 大数据的异构性 4 讨论整合方法 4.1 大数据仓库(BDW) 4.2 大数据联盟(BDF) 5 DW 和 DF 方法的比较、分…

逻辑回归中的损失函数

目录 一、损失函数介绍:二、简化上述损失函数: 一、损失函数介绍: 与回归问题成本函数不同的是,逻辑回归模型(解决分类问题)的成本函数在获得损失J的时候不再用真实值y与预测值y^的差值计算损失&#xff0…

adminPage-vue3依赖FormPage说明文档,表单页快速开发,使用思路及范例(Ⅱ)formConfig基础配置项

adminPage-vue3依赖FormPage说明文档,表单页快速开发,使用思路及范例(Ⅱ)formConfig配置项 属性: formConfig(表单项设置)keylabelnoLabeldefaultValuebindchildSlottypeString类型数据(除 time…

探索GitHub上的两个革命性开源项目

在数字世界中,总有一些项目能够以其创新性和实用性脱颖而出,吸引全球开发者的目光。今天,我们将深入探索GitHub上的两个令人惊叹的开源项目:Comic Translate和GPTPDF,它们不仅改变了我们处理信息的方式,还极…

为什么说https访问是网站的标配

在互联网时代,数据安全和隐私保护成为了不可忽视的重要议题。随着网络攻击、数据泄露等事件频发,用户对在线活动的安全性要求越来越高。HTTPS协议作为HTTP协议的加密版本,已经成为现代网站的标配,其重要性和必要性不言而喻。下面从…

【数据结构】初探数据结构面纱:栈和队列全面剖析

【数据结构】初探数据结构面纱:栈和队列全面剖析 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】初探数据结构面纱:栈和队列全面剖析前言一.栈1.1栈的概念及结构1.2栈的结构选择1.3栈的…

Xilinx FPGA:vivado fpga与EEPROM的IIC通信,串口显示数据,含使用debug教程

一、实验要求 实现FPGA与EEPROM的通信,要求FPGA对EEPROM实现先“写”后“读”,读出的值给uart发送端并显示到电脑上,按下按键1让fpga对EEPROM写入数据;按下按键2让fpga读出对EEPROM写入过的数据。 二、信号流向图 三、程序设计 …

Spring-Spring、IoC、DI、注解开发

1、Spring是什么 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。 Spring整体架构 Spring优点: Spring属于低侵入设计。IOC将对象之间的依赖关系交给Spring,降低组件之间的耦合,实现各个层之间的解耦,让我们更专注于业务…

Day1每日编程题日记:数字统计、两个数组的交集、点击消除

前言:该篇用于记录自看。曾回看昨天的做题代码,竟然会觉得陌生,这竟然是我写的,细细读了一下,原来我当时是这么想的。因此我觉得记代码没有实际用处,重点是领悟了思想,这样子代码就在心中&#…

怎样将aac转换mp3格式?推荐四个aac转MP3的方法

怎样将aac转换mp3格式?当需要将aac格式音频转换为MP3格式时,有几种方法可以轻松实现这一目标。MP3是一种广泛支持的音频格式,几乎所有设备和平台都能播放MP3文件,包括各种音乐播放器、手机、平板电脑和汽车音响系统。而且它也提供…

MQTT协议网关解决方案及实施简述-天拓四方

MQTT协议网关是一个中间件,负责接收来自不同MQTT客户端的消息,并将这些消息转发到MQTT服务器;同时,也能接收来自MQTT服务器的消息,并将其转发给相应的MQTT客户端。MQTT协议网关的主要功能包括协议转换、消息过滤、安全…

YOLOv10改进 | 主干/Backbone篇 | 利用RT-DETR特征提取网络PPHGNetV2改进YOLOv10

一、本文介绍 本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv10的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们…

会声会影分割音频怎么不能用 会声会影分割音频方法 会声会影视频制作教程 会声会影下载免费中文版2023

将素材中的音频分割出来,对声音部分进行单独编辑,是剪辑过程中的常用操作。会声会影视频剪辑软件在分割音频后,还可以对声音素材进行混音编辑、音频调节、添加音频滤镜等操作。有关会声会影分割音频怎么不能用,会声会影分割音频方…

加密软件|让数据传输更安全

加密软件在当今数字化时代扮演着至关重要的角色,它们通过先进的加密算法和技术,确保数据在存储、传输和分享过程中的安全性,从而保护个人隐私和企业机密。一、加密软件的基本作用数据加密:加密软件通过应用复杂的加密算法&#xf…

回归树模型

目录 一、回归树模型vs决策树模型:二、回归树模型的叶结点:三、如何决定每个非叶结点上的特征类型: 本文只介绍回归树模型与决策树模型的区别。如需了解完整的理论,请看链接:决策树模型笔记 一、回归树模型vs决策树模…

欣奇随机美图源码

欣赏养眼美图让人心情愉悦 新增正能量进站引导首页 上传文件解压即可用有手就行 美图输出接口自判断版 http://mt.xqia.net/api.php http://mt.xqia.net/api.php?typejson 源码下载:https://download.csdn.net/download/m0_66047725/89520368 更多资源下载&…

Kotlin MultiPlatform(KMP)

Kotlin MultiPlatform 1.KMP 是什么 Kotlin Multiplatform 是一个工具,它让我们用同一种编程语言(Kotlin)写代码,这些代码可以同时在不同的设备上运行,比如手机、电脑和网页。这样做可以节省时间,因为你不…

昇思25天学习打卡营第23天|K近邻算法实现红酒聚类

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) K近邻算法实现红酒聚类 本实验主要介绍使用MindSpore在部分wine数据集上进行KNN实验。 1、实验目的 了解KNN的基本概念;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍…