x86 - 实模式操作系统中的动态内存分配
问题描述
我正在构建一个实模式操作系统作为一个爱好项目。作为我的第一个操作系统项目,我想从头开始,因此选择构建实模式操作系统。话虽如此,我并没有特别关注任何操作系统,但有很多来源的想法。我认为更多的实模式是一种暂存模式,在给定硬件的情况下,软件可以是任何东西,而处理器的干预很少。
遇到问题,我正在构建一个alloc()
类似的系统调用,用户程序可以在他们需要更多内存时调用它。我知道brk()
类似的系统调用会更容易实现,但无论如何都会有一个malloc()
。
此操作系统中的用户程序将是一个简单的 COM 文件,没有头文件,并且静态分配了数据和代码。然而,动态分配的内存将驻留在代码和堆栈段之后。
A、AE、B、BE、C、CE 是内存模型中的地址。请注意,需要这样的内存安排以符合 SMALL 内存模型(因为大多数编译器都假定这样的模型)。
现在有了一些上下文,我计划通过下面的表格来实现动态内存分配。
“ Offset ”列是“C”地址之后分配内存的开始。当请求更多内存时,操作系统将通过以下任一方式分配内存
- 从当前空闲的表中找到一个或多个连续的足够大的块或
- 在表中最后一个条目的“偏移+大小”位置分配更多内存。
因此,free()
系统调用在完成时将释放一个或多个 a 块。
我的问题是:
- 这样的动态内存分配模型是否可行?为什么不使用这样的模型?
- 这样的系统调用是否应该在库中
alloc
而free
不是作为系统调用更好?
解决方案
这样的动态内存分配模型是否可行?为什么不使用这样的模型?
谁说这样的内存模型是不是不用呢?我创建的 BASIC 编程语言使用类似的东西来引用字符串和数组。表中的行对应于我的 BASIC 中的 StringDescriptors。
这样的系统调用是否应该在库中
alloc
而free
不是作为系统调用更好?
一个品味问题,但由于内存分配是如此基础,它认为它最属于内核。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
推荐阅读
- r - R改变路径geom_path在ggplot中通过
- javascript - Ajax 调用在我的 ASP.NET MVC 4 项目中偶尔返回 403 错误
- leaflet - 如何添加多个传单工具栏
- c++ - 如果我写“cout”,SIGTRAP 不会出现
- algorithm - 后缀树检查 k 位置之前是否存在 P 模式
- scala - 从 Akka-2.6.9 更新到 Akka 2.6.10 时 ShardCoordinator$LeastShardAllocationStrategy 中的 NullPointerException
- entity-framework - 为什么这个模型不更新?
- python - 如何在随机游走中使用 imshow 和 colorbar 函数?
- directwrite - DirectWrite 用多种颜色绘制连字?
- node.js - 返回空对象但无法执行 !posts if 语句以在 express 应用程序中使用 mongoose 引发错误