内存分配器必须基于系统调用吗?

时间:2012-01-17 04:33:38

标签: memory operating-system memory-management kernel

我的问题不仅限于现有系统。分配内存时必须做什么?我听说过内存管理器lmm(list-based memory manager),但找不到任何系统调用。

2 个答案:

答案 0 :(得分:2)

除非事先知道应用程序或驱动程序的内存要求(在执行开始之前),否则该驱动程序或应用程序通常应该以某种方式从OS /内核请求内存。

系统调用是一种产生内存分配请求的方法。通常系统调用调用是通过专用CPU指令完成的(例如x86 CPU上的intsyscallsysenter

但是可能有其他方法调用OS /内核来请求内存,应用程序/驱动程序可以启动的其他指令或事件将使CPU抢占应用程序/驱动程序的执行并将控制权转移到操作系统中/核心。当尝试访问受保护或未被物理内存备份的内存位置时发生的页面错误可能是另一个错误。例如,应用程序可能有自己的虚拟地址空间,每当它尝试从没有分配物理内存的内存中读取或写入时,CPU就会将应用程序从应用程序切换到内核,从而分配内存,然后CPU切换回来。这是另一种不一定涉及任何系统调用的方式。

当然,如果没有操作系统或缺少内存管理服务,并且只有一个应用程序在任何给定时间运行,并且它可以访问所有计算机资源(这或多或少是您在DOS中所拥有的) ,它可以管理内存本身,在这种情况下,不需要系统调用。

至于what must be done when allocating memory的其余部分,它取决于操作系统(如果有的话)和CPU。例如,可能需要将存储器的物理页面映射到虚拟地址空间中。通常,整个地址空间需要以某种方式切割成分配的内存块。内存管理器必须跟踪地址空间的已分配区域和空闲区域。内存保护(如果CPU和OS支持)也需要处理。所有常见的东西。

答案 1 :(得分:1)

在内核管理物理内存的系统上,进程必须要求内核提供更多内存(即进行系统调用),否则内核必须自动分配进程所需的页面,当进程取消引用指向指针时在其现有的文本和数据段之外。这适用于在用户空间中运行的lmm或任何其他内存分配器。如果您查看链接到的lmm页面上的示例代码,您将看到对 sbrk (Unix系统调用)的调用以获取内存块,然后将其传递给 lmm_add_free

在进程具有完全和直接访问物理内存的系统上,该进程可以按照自己的喜好进行操作。没有内核意味着没有系统调用。