首页 > 解决方案 > 实模式操作系统中的动态内存分配

问题描述

我正在构建一个实模式操作系统作为一个爱好项目。作为我的第一个操作系统项目,我想从头开始,因此选择构建实模式操作系统。话虽如此,我并没有特别关注任何操作系统,但有很多来源的想法。我认为更多的实模式是一种暂存模式,在给定硬件的情况下,软件可以是任何东西,而处理器的干预很少。

遇到问题,我正在构建一个alloc()类似的系统调用,用户程序可以在他们需要更多内存时调用它。我知道brk()类似的系统调用会更容易实现,但无论如何都会有一个malloc()

此操作系统中的用户程序将是一个简单的 COM 文件,没有头文件,并且静态分配了数据和代码。然而,动态分配的内存将驻留在代码和堆栈段之后。

在此处输入图像描述

A、AE、B、BE、C、CE 是内存模型中的地址。请注意,需要这样的内存安排以符合 SMALL 内存模型(因为大多数编译器都假定这样的模型)。

现在有了一些上下文,我计划通过下面的表格来实现动态内存分配。 在此处输入图像描述

Offset ”列是“C”地址之后分配内存的开始。当请求更多内存时,操作系统将通过以下任一方式分配内存

因此,free()系统调用在完成时将释放一个或多个 a 块。

我的问题是:

  1. 这样的动态内存分配模型是否可行?为什么不使用这样的模型?
  2. 这样的系统调用是否应该在库中allocfree不是作为系统调用更好?

标签: x86x86-16osdevreal-mode

解决方案


这样的动态内存分配模型是否可行?为什么不使用这样的模型?

谁说这样的内存模型是不是不用呢?我创建的 BASIC 编程语言使用类似的东西来引用字符串和数组。表中的对应于我的 BASIC 中的 StringDescriptors。

这样的系统调用是否应该在库中allocfree不是作为系统调用更好?

一个品味问题,但由于内存分配是如此基础,它认为它最属于内核。int然后也许是使用指令的系统调用......

偏移量、大小、状态和块。

这些是您选择放入分配表中的东西。您放入的所有内容也需要更新。当有冗余信息时,这是很多额外的工作。您可以删除大小信息,因为您可以通过减去两个相邻的指针得出它。
您也可以不使用Blocks信息,因为如果 free()在 FREE 块聚集在一起时立即合并,它将始终为 1 。

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  FREE     ; Size is 110 == (CE+127) - (CE+17)
CE+127, USED     ; Size is 40 == (CE+167) - (CE+127)
CE+167, EOL      ; TotalRowsCount = 5

新分配的 105 个字节:

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  USED     ; Size is 105 == (CE+122) - (CE+17)
CE+122, FREE     ; Size is 5 == (CE+127) - (CE+122)
CE+127, USED     ; Size is 40 == (CE+167) - (CE+127)
CE+167, EOL      ; TotalRowsCount = 6

释放 40 字节分配:

CE+0,   USED     ; Size is 7 == (CE+7) - (CE+0)
CE+7,   USED     ; Size is 10 == (CE+17) - (CE+7)
CE+17,  USED     ; Size is 105 == (CE+122) - (CE+17)
CE+122, FREE     ; Size is 45 == (CE+167) - (CE+122)
CE+167, EOL      ; TotalRowsCount = 5

推荐阅读