Linux 在程序集中动态分配内存?

Linux 在程序集中动态分配内存?,linux,assembly,memory-management,Linux,Assembly,Memory Management,例如,如果我想分配一个未知大小的动态内存部分,或者更确切地说,在运行时已知大小的内存部分,在用户输入他想要分配的兆字节数之后,最好的方法是什么?是不是从C调用“malloc”要求操作系统为我这样做?还是有更好的办法通常是怎么做的? 请注意,我不想保留另一种方法是定义尽可能大的静态数组,并编写自己的malloc/免费子例程。它很简单,特别是在没有多线程或其他类型的共享使用分配的块的情况下。保留第一个空块的地址,并在每个块的开头存储块的大小和下一个空闲块的地址 PS:已分配(保留)块还包含块大小作为

例如,如果我想分配一个未知大小的动态内存部分,或者更确切地说,在运行时已知大小的内存部分,在用户输入他想要分配的兆字节数之后,最好的方法是什么?是不是从C调用“malloc”要求操作系统为我这样做?还是有更好的办法通常是怎么做的?


请注意,我不想保留

另一种方法是定义尽可能大的静态数组,并编写自己的
malloc
/
免费
子例程。它很简单,特别是在没有多线程或其他类型的共享使用分配的块的情况下。保留第一个空块的地址,并在每个块的开头存储块的大小和下一个空闲块的地址


PS:已分配(保留)块还包含块大小作为前缀。下一个块的地址在此不使用,可以是0作为“保留”内存的标志。更简单的解决方案是只使用块大小和标志free/used_块,但通过这种方式,您必须扫描多个保留块,直到到达free块,这比只使用一个空闲块链要慢。

mmap2和brk系统调用是在汇编中执行此操作的最简单方法。mmap2系统调用更难在汇编中使用,但如果您需要大量动态分配的内存,这是一种方法。
brk易于使用,它通过移动“程序中断”(程序内存空间的边界)来有效地为程序分配更多内存。如果您需要少量的动态内存(例如,少于一整页),这是一种方法。

调用malloc或mmap,就像从C中调用一样,或者像C编译器在它从C生成的asm中所做的那样。(或者
realloc
/
calloc
/
aligned\u alloc
/无论什么。)最好的方法取决于您正在做什么。
malloc
是C库中的一个函数。如果不想将其链接到程序,可以使用底层系统调用,通常是
sbrk
mmap
。但是你的问题在这个网站上是不可接受的。相关的非Linux示例:avr libc(用于运行在8位RISC avr体系结构上的裸机程序)实现了malloc。有关分配器如何工作和管理其自由列表,请参见末尾的“实现细节”部分。如果您想实现自己的分配器,您当然可以在Linux(任何体系结构)上的用户空间中执行类似的操作。但通常没有理由这么做,只要调用
aligned\u alloc
。虽然通常任何值得在asm中编写的高性能循环都避免了动态分配。“通常是如何做到的”的答案:根本不是来自asm。在asm中只编写真正对性能至关重要的代码部分。例如,请参见
x264
ffmpeg
,其中大多数代码是C语言,只有少数SIMD或任何函数是用asm手工编写的。当我们在汇编中编写应用程序时,PC-DOS是一个单用户系统,默认情况下您可以获得所有内存。所以这不是问题。现在,我会用C或其他语言编写主程序,设置环境,然后可能调用一些程序集来完成一项非常特殊的任务。从汇编中调用
malloc
并不比从C中调用快,只是更难。如果您要实现自己的malloc/free,您通常会在
sbrk
和/或
mmap
系统调用的基础上进行,以便在空闲列表为空时从操作系统获取更多内存。有了一个巨大的静态阵列,一旦内存被触动,就永远无法将其返回操作系统。(除了数组页面上的
munmap/mmap
)老实说,这对于“玩具”程序来说并不是一个坏答案。这不是一个好的设计,但它非常简单,对于初学者来说,可能很容易在asm中实现。(这不是我的反对票)。顺便说一句,您描述的细节似乎要求释放函数提供块的大小,因此它不同于
malloc
/
free
API。这是另一种方式,取决于OP的需要。但如果有人不喜欢它,认为它不严重,让他(或她)想想为什么OP在汇编中为Linux编写程序<上面的评论中已经提到了code>mmap,我不得不说一些其他的话,不要重复同样的话。关于初始
mmap
/
munmap
阵列分配-当然可以这样做,但如果对RAM的需求较低(例如,总计10-20MB),也可以静态保留。如果您要发布答案,您可以重复(并扩展)评论中的任何/所有好建议。事实上,我们鼓励将答案评论变成正确的答案。我之所以发表评论,是因为这个问题太模糊,不知道什么样的答案是合适的,但如果你要发布一个,你肯定应该提到
mmap
sbrk
@PeterCordes我开始写评论,然后决定将其作为答案发布,因为:1)这是一个可能的解决方案,不是最好的或推荐的,但也不推荐在Linux下用汇编编写;2) 因为评论太长了。关于
mmap
您是对的,但请告诉问题下的注释-为什么它们不是答案?无论如何,如果OP想学习汇编而不是开发“严肃”的软件,他可以选择我的解决方案而不是
mmap
。malloc是一个c库函数,而不是一个系统调用。Malloc基本上包装了brk和mmap2系统调用,但它也保存了有关内存的内部信息,这些内存已分配给以后的Malloc调用或空闲调用。如果您愿意,您只能在c库中使用malloc。但是它更简单,而且从assemlby使用它的开销也不多,不?
malloc
将是最简单的。与C-t相比,使用it组件没有性能开销