如何在Assembly(x64 / Linux)中使用动态分配的内存?

问题描述 投票:0回答:1

我正在尝试构建一种玩具语言编译器(为NASM生成程序集),到目前为止还不错,但是我真的陷入了动态内存分配的话题。这是大会上阻止我开始执行的唯一部分。目的只是为了学习底层的工作方式。

关于如何使用Assembly(最好是x64 / Linux)如何动态分配,使用和释放内存,是否有一本很好且全面的指南/教程/书?我在这里到那里都发现了一些提示,并提到了brksbrkmmap,但是我不知道如何使用它们,我觉得它不仅仅检查参数和返回值。这些系统调用。它们究竟如何工作?

例如,在this post中,提到了sbrk移动数据段的边界。我可以知道边界在哪里吗?我可以仅将初始数据段用于第一个动态分配(以及如何)吗?

sbrk解释了This other post在C中的工作原理,但没有解释C实际上如何将内存分配给OS。我也已经开始阅读一些有关汇编的书籍,但是以某种方式,它们似乎忽略了这个主题(也许是因为它特定于操作系统)。

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

我知道一种方法是使用glibcfree,但是我想知道如何从汇编中完成。编译语言甚至LLVM如何做到这一点?他们只是使用C的malloc吗?

linux assembly memory-management x86-64 nasm
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.