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

Memory 内存分配器必须基于系统调用吗?,memory,operating-system,memory-management,kernel,Memory,Operating System,Memory Management,Kernel,我的问题不局限于现有的系统。分配内存时必须做什么?我听到了内存管理器的声音,但找不到任何系统调用。在内核管理物理内存的系统上,要么进程必须向内核请求更多内存(即进行系统调用)或者,当进程取消引用指向其现有文本和数据段之外的指针时,内核必须自动分配进程所需的页面。这适用于lmm或在用户空间中运行的任何其他内存分配器。如果查看链接到的lmm页面上的示例代码,您将看到对sbrk(Unix系统调用)的调用,以获取一块内存,然后将其交给lmm\u add\u free 在一个进程可以完全直接访问物理内存的

我的问题不局限于现有的系统。分配内存时必须做什么?我听到了内存管理器的声音,但找不到任何系统调用。

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


在一个进程可以完全直接访问物理内存的系统上,该进程可以随心所欲。没有内核意味着没有系统调用。

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

系统调用是发出内存分配请求的一种方式。通常,系统调用是通过专用CPU指令完成的(例如x86 CPU上的
int
syscall
syscenter

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

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

至于剩余的
分配内存时必须做什么
,这取决于操作系统(如果有的话)和CPU。例如,可能需要将内存的物理页映射到虚拟地址空间。通常,整个地址空间都需要以某种方式分割成分配的内存块。内存管理器必须跟踪地址空间的已分配区域和可用区域。内存保护(如果CPU和操作系统支持)也需要注意。所有平常的东西