我的问题并不仅仅局限于现有systerm.What分配内存时必须做什么?我听说过内存管理器lmm(list-based memory manager),并且找不到任何系统调用。必须根据系统调用分配内存吗?
回答
在其中一个内核来管理物理内存的系统,无论是过程必须要求更多的内存的内核(即进行系统调用)或内核自动分配的网页的过程中要当进程解引用一个指针在现有文本和数据段之外的点。这适用于在用户空间中运行的lmm或任何其他内存分配器。如果您查看链接的lmm页面上的示例代码,您将看到一个调用sbrk(一个Unix系统调用)以获得一个内存块,然后交给lmm_add_free。
在哪里的过程有全面和直接访问物理内存的系统,那么该过程可以做它喜欢。没有内核意味着没有系统调用。
除非应用程序或驱动程序的存储器要求是预先已知的(它们的执行开始之前),该驱动程序或应用程序通常应该从OS /内核在这样或那样的请求存储器。
系统调用是使内存分配请求的一个这样的方式。常的系统调用的调用是由专用CPU指令来完成(例如int
,syscall
,sysenter
在x86 CPU上)。
但是,可能有其他方法调用OS /内核来请求内存,或者应用程序/驱动程序可以启动的其他指令或事件,这将使CPU抢占应用程序/驱动程序的执行并将控制权转移到OS /内核。当尝试访问受保护或未由物理内存备份的内存位置时发生的页面错误可能是另一个错误。例如,应用程序可能有自己的虚拟地址空间,每当它试图从没有分配物理内存的内存读取数据或写入内存时,CPU都会将执行从应用程序切换到内核,从而分配内存,然后CPU切换回来。这是另一种不一定涉及任何系统调用的方式。
当然,如果没有操作系统或缺乏内存管理服务,并且在任何给定时间只有一个应用程序在运行,并且它可以访问所有计算机资源(这与DOS
差不多),它可能管理内存本身,在这种情况下不需要系统调用。
至于what must be done when allocating memory
的其余部分,它取决于OS(如果有)和CPU。例如,可能有必要将物理页面的内存映射到虚拟地址空间。通常,整个地址空间需要以某种方式分割成分配的内存块。内存管理器必须跟踪分配的和空闲的地址空间区域。内存保护(如果受到CPU和操作系统的支持)也需要照顾。所有常见的东西。
- 1. 系统调用分配内存用户
- 2. 系统内存259522560必须至少4.718592E8
- 3. CUDA - 我必须每次都分配和释放内存吗?
- 4. 没有mmap2系统调用strace的内存分配?
- 5. 操作系统内存分配地址
- 6. 操作系统内存分配
- 7. 64位操作系统内存分配
- 8. x64 linux,C++线程内存分配:我必须使用互斥锁吗?
- 9. 在Linux API或系统调用失败后,我必须处理所有errno吗?
- 10. PHP内存vs操作系统分配的内存
- 11. Symfony2 + OneToMany +必须保存数据吗?
- 12. 为什么你必须在OSX上打系统调用?
- 13. glBufferData是根据现场的大小实际分配内存吗?
- 14. 在使用此系统调用之前是否需要分配内存?
- 15. 如何在Linux下使用汇编和系统调用动态分配内存
- 16. SH:内存不足的系统调用
- 17. 调试Google数据存储:IllegalArgumentException:projectId必须匹配以下模式
- 18. Outlook olMailItem.Attachments.Add - 附件必须位于文件系统上吗?
- 19. 我必须为Windows7系统安装驱动程序吗?
- 20. 你必须使用微内核吗?
- 21. 必须将Windows系统区域设置为系统范围?
- 22. 必须从IQueryable.GetEnumerator中调用IQueryProvider.Execute吗?
- 23. 之前必须调用“WebSecurity.InitializeDatabaseConnection”方法吗?
- 24. 我必须在React中调用super.componentDidUpdate吗?
- 25. 下来(信号量)和down_intterruptible(信号量)必须从系统调用中调用?
- 26. 是getaddrinfo()系统调用吗?
- 27. 分配时是否必须使用initWithString?
- 28. 我必须用根生产
- 29. 根据系统日期为月份和期间分配变量
- 30. 文档根元素“配置”,必须匹配DOCTYPE根“空”