我正在尝试构建一种玩具语言编译器(为NASM生成程序集),到目前为止还不错,但是我真的陷入了动态内存分配的话题。这是大会上阻止我开始执行的唯一部分。目的只是为了学习底层的工作方式。
关于如何使用Assembly(最好是x64 / Linux)如何动态分配,使用和释放内存,是否有一本很好且全面的指南/教程/书?我在这里到那里都发现了一些提示,并提到了brk
,sbrk
和mmap
,但是我不知道如何使用它们,我觉得它不仅仅检查参数和返回值。这些系统调用。它们究竟如何工作?
例如,在this post中,提到了sbrk
移动数据段的边界。我可以知道边界在哪里吗?我可以仅将初始数据段用于第一个动态分配(以及如何)吗?
sbrk
解释了This other post在C中的工作原理,但没有解释C实际上如何将内存分配给OS。我也已经开始阅读一些有关汇编的书籍,但是以某种方式,它们似乎忽略了这个主题(也许是因为它特定于操作系统)。
有一些有效的汇编代码示例吗?我真的找不到足够的信息。
我知道一种方法是使用glibc的free
,但是我想知道如何从汇编中完成。编译语言甚至LLVM如何做到这一点?他们只是使用C的malloc
吗?
malloc
是为用户空间程序提供的接口。它可能具有不同的实现,例如malloc
,ptmalloc
和tcmalloc
。根据不同的环境,您可以选择使用不同的分配器,甚至实现自己的分配器。据我所知,jemalloc
通过jemalloc
所需的内存块来管理用户空间程序的内存,mmap
控制何时将内存块释放给内核/系统。(我知道jemalloc
在Android中使用。)此外,根据系统内存的不同状态,jemalloc
也将使用jemalloc
。有关更多详细信息,我认为您必须阅读要学习的不同分配器的代码。