【发布时间】:2012-02-11 23:10:42
【问题描述】:
我的问题不限于现有的系统。分配内存时必须做什么?我听说过内存管理器lmm(list-based memory manager),但找不到任何系统调用。
【问题讨论】:
标签: memory operating-system memory-management kernel
我的问题不限于现有的系统。分配内存时必须做什么?我听说过内存管理器lmm(list-based memory manager),但找不到任何系统调用。
【问题讨论】:
标签: memory operating-system memory-management kernel
除非事先知道应用程序或驱动程序的内存需求(在它们开始执行之前),否则该驱动程序或应用程序通常应该以一种或另一种方式从操作系统/内核请求内存。
系统调用是发出内存分配请求的一种方式。通常系统调用调用是通过专用 CPU 指令完成的(例如 x86 CPU 上的int、syscall、sysenter)。
但可能还有其他方法可以调用操作系统/内核以请求内存,应用程序/驱动程序可以启动的其他指令或事件将使 CPU 抢占应用程序/驱动程序的执行并将控制权转移到操作系统/核心。当试图访问受保护或不受物理内存支持的内存位置时发生的页面错误可能是另一种情况。例如,一个应用程序可能有自己的虚拟地址空间,每当它尝试从没有分配物理内存的内存中读取或写入时,CPU 会将执行从应用程序切换到分配内存的内核,然后 CPU 切换回来。这是另一种不一定涉及任何系统调用的方式。
当然,如果没有操作系统或缺少内存管理服务,并且在任何给定时间只有一个应用程序在运行并且它可以访问所有计算机资源(这或多或少是您在 DOS 中所拥有的),它可以自己管理内存,在这种情况下不需要系统调用。
至于what must be done when allocating memory 的其余部分,它取决于操作系统(如果有)和 CPU。例如,可能需要将内存的物理页映射到虚拟地址空间。通常,整个地址空间需要以某种方式分割成分配的内存块。内存管理器必须跟踪地址空间的分配和空闲区域。内存保护(如果 CPU 和操作系统支持)也需要注意。所有常见的东西。
【讨论】:
在内核管理物理内存的系统上,进程必须向内核请求更多内存(即进行系统调用),或者当进程取消引用指向的指针时,内核必须自动分配进程所需的页面在其现有的文本和数据段之外。这适用于 lmm 或在用户空间中运行的任何其他内存分配器。如果您查看链接到的 lmm 页面上的示例代码,您会看到对 sbrk 的调用(一个 Unix 系统调用)以获取一块内存,然后将其交给 lmm_add_free。
在一个进程可以完全直接访问物理内存的系统上,该进程可以为所欲为。没有内核意味着没有系统调用。
【讨论】: