首页 > 解决方案 > 如何在 Assembly (x64/Linux) 中使用动态分配的内存?

问题描述

我正在尝试构建一个玩具语言编译器(为NASM生成程序集),到目前为止一切都很好,但我真的陷入了动态内存分配的话题。这是组装中唯一阻止我开始实施的部分。目标只是了解事物在低级别是如何工作的。

是否有关于如何使用 Assembly(最好是 x64/Linux)动态分配、使用和释放内存的良好而全面的指南/教程/书籍?我在这里和那里找到了一些提示brk,sbrkmmap,但我不知道如何使用它们,我觉得除了检查这些系统调用的参数和返回值之外还有更多的东西。它们究竟是如何工作的?

例如,在这篇文章中,提到了sbrk移动数据段的边框。我可以知道边界最初/调用后的位置sbrk吗?我可以只使用我的初始数据段进行第一次动态分配(以及如何)?

另一篇文章解释了freeC 中的工作原理,但没有解释 C 是如何将内存返回给操作系统的。我也开始阅读一些关于汇编的书籍,但不知何故,他们似乎忽略了这个话题(可能是因为它是特定于操作系统的)。

是否有一些有效的汇编代码示例?我真的找不到足够的信息。

我知道一种方法是使用glibcmalloc但我想知道它是如何从汇编中完成的。编译语言甚至 LLVM 是如何做到的?他们只使用Cmalloc吗?

标签: linuxassemblymemory-managementx86-64nasm

解决方案


malloc是为用户空间程序提供的接口。ptmalloc它可能有不同的实现,例如tcmallocjemalloc。根据不同的环境,您可以选择不同的分配器来使用甚至实现自己的分配器。据我所知,通过一块所需的内存jemalloc来管理用户空间程序的内存,并控制何时将内存块释放给内核/系统。(我知道在Android中使用。)也根据不同的状态使用系统内存。有关更详细的信息,我认为您必须阅读您想学习的不同分配器的代码。mmapjemallocjemallocjemallocsbrk


推荐阅读