X86 实模式操作系统中的动态内存分配
我正在建立一个真正的模式操作系统作为一个爱好项目。作为我的第一个操作系统项目,我想从一开始就开始,因此选择构建一个真正的操作系统。话虽如此,我并没有特别关注任何操作系统,但我有许多来源的想法。我认为更真实的模式是一种草稿行模式,在这种模式下,给定硬件,软件可以是任何东西,处理器的干预非常少 谈到这个问题,我正在构建一个类似于X86 实模式操作系统中的动态内存分配,x86,x86-16,osdev,real-mode,X86,X86 16,Osdev,Real Mode,我正在建立一个真正的模式操作系统作为一个爱好项目。作为我的第一个操作系统项目,我想从一开始就开始,因此选择构建一个真正的操作系统。话虽如此,我并没有特别关注任何操作系统,但我有许多来源的想法。我认为更真实的模式是一种草稿行模式,在这种模式下,给定硬件,软件可以是任何东西,处理器的干预非常少 谈到这个问题,我正在构建一个类似于alloc()的系统调用,用户程序可以在需要更多内存时调用它。我知道像brk()这样的系统调用更容易实现,但无论如何都会有malloc() 这个操作系统中的用户程序将是一个简
alloc()
的系统调用,用户程序可以在需要更多内存时调用它。我知道像brk()
这样的系统调用更容易实现,但无论如何都会有malloc()
这个操作系统中的用户程序将是一个简单的COM文件,没有头,并且静态分配数据和代码。但是,动态分配的内存将位于代码和堆栈段之后 A、AE、B、BE、C、CE是内存模型中的地址。请注意,这样的内存安排需要符合小内存模型(因为大多数编译器都采用这种模型) 现在有了一些上下文,我计划通过下面的表实现动态内存分配。 “偏移量”列是在“C”地址之后分配内存的开始。当请求更多内存时,操作系统将通过以下方式分配内存:
- 从当前空闲或空闲的表中查找一个或多个连续的足够大的块
- 在表中最后一项的“偏移量+大小”位置分配更多内存
free()
系统调用完成后将释放一个或多个a块
我的问题是:
alloc
和free
是否应该在库中进行,而不是作为系统调用alloc
和free
是否应该在库中进行,而不是作为系统调用
这是一个品味的问题,但由于内存分配是如此基本,它认为它最属于内核。然后可能会使用int
指令进行系统调用
偏移、大小、状态和块。
这些是您选择放在分配表中的内容。你投入的所有东西也需要更新。当存在冗余信息时,这将是大量的额外工作。您可以删除大小信息,因为您可以通过减去两个相邻指针来获得它。您也可以不使用块信息,因为当自由块聚集在一起时,如果自由块立即合并,则它将始终为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
“但是,动态分配的内存将位于代码和堆栈段之后。”请确认我的理解:分配表是否位于C和CE之间的1KB内存中?这个表有多少条记录?尺寸是多少?是字节吗?“区块”是什么意思?@SepRoland分配表将位于其他位置。在“进程”表中说-每个进程一个。大小以字节为单位。块是表中的行。如果我们想要105个字节,操作系统将从CE+17(第3行和第4行)开始分配110个字节(然后将它们标记为已使用)。这就是为什么我们有Blocks=2。在释放时,操作系统会将这两行标记为空闲。在我看来,您的表不应包含两行或更多标记为空闲的相邻行。如果要释放的内存位于另一个可用内存的正上方或正下方,则free()系统调用应立即合并。只需向上移动较低的行,并保持全行。这样,您分配105字节的示例将变得更简单。谢谢您的回复。我实际上是在用Blocks列合并自由连续空间。但是,如果我进行了适当的整合,我可以按照要求分配确切的空间,并将剩余的可用空间保留在另一个新块中。但为了保持简单,我采用了这种方法——找到最大的连续空闲块并分配它们(至少在一个基础上)