如何区分内存(堆)和栈地址

3

我的问题是:当我有像这样的东西时:

lea rax, rbp - 8

// 可能是因为我在代码中有一个本地的“int”变量,所以这是我的堆栈上的int。 当我这样做时,CPU如何知道数据在哪里:

mov qword [rax], 14

我是一名有用的助手,可以为您翻译文本。

我的意思是,这只是一个地址...如果我在 2^64 - x 处保留了内存会怎么样?

您分配的内存是否可以具有此类地址?

或者,如果堆栈增长到与您分配的内存具有相同的地址,会发生什么?

这种情况会发生吗?

汇编程序不知道rax中的数字,因此它不能像近跳转和远跳转一样是MOVstack和MOVheap。


2
堆栈和堆是高于指令集的概念。指令集在给定的寄存器中读写内存地址,这些地址对程序有意义,但对硬件没有任何意义。您可以使用堆栈指针来读取堆,使用GPR来读取堆栈,硬件不会关心也不会介意。 - old_timer
1
谢谢,就是这些愚蠢的小事让你整夜都无法前进... - Banyoghurt
1个回答

6
当我执行mov qword [rax], 14时,CPU如何知道数据在哪里?
为什么CPU需要知道数据是在堆栈还是堆中?它们都在同一个地方,即RAM。
我的意思是,这只是一个地址...如果我在2^64处保留了内存会怎样?
如果地址大于您的地址空间,则无法在那里保留内存。
或者,如果堆栈增长到具有与分配内存相同的地址,会发生什么?这就是堆栈溢出 :) 并且很可能会导致分段错误。
汇编程序不知道rax中的数字,因此它既不能是MOVstack也不能是MOVheap。
据我所知,访问堆栈或堆没有单独的指令,就像我说的,堆栈和堆都存在于RAM中。 CPU关心的只是要读取或写入的地址,但在某些体系结构上,那些没有内存映射I/O的体系结构有专门用于访问I / O寄存器的指令,大多数体系结构将I / O视为另一个内存地址。
你应该读一本关于计算机体系结构的书,我推荐这本 Computer Organization and Design, 4th Ed by Patterson.

CPU 直接访问 RAM 吗?我认为所有的都通过 MTU 进行,我在考虑虚拟地址空间,但是我没有在问题中提到这一点...但这是否意味着堆栈大小有限? - Banyoghurt
@user1821933 这取决于架构,它可以直接访问 RAM 或通过缓存访问,也可以使用直接访问或 DMA。 - iabdalkader
2
@user1821933 你可能指的是MMU,不是每个CPU都有一个,有些甚至没有缓存或需要外部内存(MCUs),在这种情况下,CPU可以直接从内存传输或通过DMA传输,无论哪种方式,栈与堆的问题都不相关,而且栈的大小是有限的,RAM也是有限的 :) - iabdalkader
内存有层次,深入处理器中有一个RAM接口,然后你会得到MMU、缓存和内存控制器、外设等,这些扩展了处理器的访问。在指令级别上(在这种架构上),内存访问是内存访问。使用指定的地址,按指定的大小执行读取或写入,并将值放置或获取到指定位置。 - old_timer
1
在指令级别上,RAM地址不必有意义,您可以轻松地告诉处理器访问一个没有外设或内存映射的地址,汇编程序应该接受该地址并正确编码指令,处理器应该正确启动指令,从那里发生的故障是否直接影响执行或发生在该指令执行之后取决于架构。 - old_timer
2
重要的是将事物分开放置在它们应该在的地方。.data、.text等,堆栈与堆,有符号与无符号加减法,字符与字节,这些都是编程概念,与硬件没有直接关系。虽然有堆栈指针和堆栈指令,但这与实际内存或任意定义一个字节在堆栈中,另一个字节在堆中,另一个字节在.text等位置无关。同时,将处理器及其指令集与其外设(包括MMU等)分开。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接