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
    是否应该在库中进行,而不是作为系统调用
  • 这种动态内存分配模型是否可行?为什么不使用这样的模型

    谁能说这种记忆模式是否没有被使用?我创建的一种基本编程语言使用类似的方法来引用字符串和数组。表中的行对应于我的BASIC中的StringDescriptor

    这样的系统调用
    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列合并自由连续空间。但是,如果我进行了适当的整合,我可以按照要求分配确切的空间,并将剩余的可用空间保留在另一个新块中。但为了保持简单,我采用了这种方法——找到最大的连续空闲块并分配它们(至少在一个基础上)