汇编堆...试图研究测试

时间:2012-05-06 21:33:58

标签: assembly stack heap

我的考试即将开始,我们必须学习堆栈和堆栈。堆栈部分我理解,但堆给我带来麻烦。

我们的书给了我们C和大会。但我很难理解这两个概念。

我将张贴这本书的截图,使它看起来更好。

问题:

  • Heap_Init如何运作?

  • Heap_Allocate如何运作?

  • Heap_Release如何运作?

enter image description here

enter image description here

感谢大家的时间和精力。

1 个答案:

答案 0 :(得分:2)

在这个意义上的堆是一个不在堆栈上的内存区域,程序可以用来存储更大量的数据。

但是,在程序的生命周期中,该程序必须跟踪自己的内存使用情况。具体来说,程序无法随意写入其整个虚拟地址空间;如果尝试写入的地址未被触发访问冲突的操作系统映射,这将导致程序收到segmentation fault并被终止。

因此,正在运行的程序必须要求操作系统分配一些空间。如果可以,操作系统将执行此操作,并将该空间映射到虚拟地址空间。

但是,如果您需要释放一部分内存,您需要知道它的位置以及您正在使用它做什么。此外,您需要知道,因为程序给出了特定大小的内存存储位置。事情变得非常复杂 - 如果你从C语言中分配大量内存,然后经常再次释放,那么在分配和释放以及系统调用之间建立1-1映射是没有意义的。同样的效果。相反,如果内存分配器只是从操作系统中拉出一大块内存然后跟踪它就会更好。

需要一个存储结构来跟踪当前正在使用的分配空间,以及虚拟地址空间中的哪些范围被标记出来以供使用。

所以,

  • Heap_Init设置此结构,并且可能在任何现代分配器中初始化一些内存。
  • Heap_Allocate使用此结构,并在给定请求时返回指向可用空间的指针。这可能会或可能不会要求程序从操作系统请求更多空间。
  • Heap_Free使用该结构释放先前分配的内存。

这就是这些功能将起什么作用的理论。如果查看代码,您应该能够确定具体实现的功能。