【发布时间】:2019-11-10 00:01:32
【问题描述】:
我的问题是关于汇编中动态内存分配的逻辑(特别是 MASM)。关于这个主题有很多文章,它们都依赖于 malloc 或 brk 的使用。但是,根据我的理解,作为 C 语言一部分的 malloc 必须(或可以)肯定是用汇编编写的。 brk 的同义词,因为它是操作系统的一部分,因此也是用 C 编写的,可以通过汇编进行 1 对 1 的替换。很久很久以前,我在 PCMag 上看到一篇关于在 MS-DOS 中使用纯 asm 进行动态内存分配的文章。不幸的是,我已经失去了这篇精彩作品的所有痕迹。现在我正在使用 FreeDOS(可精确启动的 FreeDOS 闪存卡),并且想知道如果有人决定编写自己的内存分配器,该怎么办?不依赖操作系统机制的内存分配的出发点和逻辑是什么?
【问题讨论】:
-
您的“纯 asm”示例可能依赖于中断或其他东西。要么,要么他们分配自己的大型静态内存块,并将其用作他们的堆,从中分配他们自己的“动态”块。程序集有一个非常静态的内存视图,因此您的自定义 malloc 实现将依赖于某种系统调用/中断,或者只是作为目标文件(BSS/数据段)的一部分分配的大型静态内存块
-
你在这里缺少的是,如果你不使用 FreeDOS 的分配器,你将不知道 FreeDOS(和其他东西)已经分配了哪些内存,而 FreeDOS 也不知道你的内存是多少已分配。您可以做的是使用 FreeDOS 分配一大块内存,然后使用您自己的分配器对其进行子分配。请注意,您不能只自己编写 brk(),因为在 Unix 类型的系统上,它是一个将内存映射到进程的系统调用,这需要在内核中完成。换句话说,要在最低级别执行内存分配,您需要编写自己的操作系统。
-
@prushik :不,您不一定可以访问所有内存,除非您想破坏 MS-DOS 和其他应用程序,使系统无法使用。通常 DOS 程序会为 HEAP 操作请求超出程序最低要求的额外内存。顺便说一句,我最近写了一个有关加载时 MS-DOS 分配的一些相关的 SO 答案。 stackoverflow.com/a/56747280/3857942 。你可以为你的堆请求可用空间,然后你写一个分配器(malloc/free)来使用你从 MS-DOS 请求的内存块。
-
因为中断都是由 BIOS 提供的 - 不,DOS 系统调用的 ABI 是
int 21h和 AH= call number。 BIOS 使用几个不同的中断号,但它不是唯一可以通过软件中断调用的东西。 -
当然,DOS 中的程序在编写时都知道它们被分配了哪些内存。所有程序都可以在任何地方编写,但为了发挥功能,它们通常会尝试相互配合。这通常意味着不要随意走遍 MS-DOS 和其他应用程序。你想要你请求的内存。你的内存太多了,你还给它。
标签: assembly dos heap-memory dynamic-memory-allocation x86-16