memory-management - 当进程访问刚用 brk/sbrk 分配的地址时,内核会发生什

这其实是一道关于内存管理的理论题。由于不同的操作系统以不同的方式实现事物,我将不得不减轻对知识的渴望,询问事物如何在其中一个操作系统中工作:(最好是开源和广泛使用的操作系统:Linux。

这是我在整个谜题中所知道的事情的列表:

  • malloc() 是用户空间。 libc 负责系统调用作业(调用 brk/sbrk/mmap...)。它设法获得大块内存,由虚拟地址范围描述。该库将这些 block 切片并设法响应用户应用程序请求。
  • 我知道 brk/sbrk 系统调用的作用。我知道“程序中断”是什么意思。这些调用基本上插入程序中断偏移量。这就是 libc 获取其虚拟内存块的方式。
  • 既然用户应用程序有一个新的虚拟地址可以操作,它只需向其中写入一些值。比如:*allocated_integer = 5;。行。怎么办?如果 brk/sbrk 只更新进程表中进程条目的偏移量,或者其他什么,物理内存实际是如何分配的?
  • 我知道虚拟内存、页表、页面错误等。但我想确切地知道这些东西与我描述的这种情况有何关系。例如:进程的页表是否被修改?如何?什么时候?发生页面错误?什么时候?为什么?出于什么目的?这个“伙伴算法”何时被调用,这个free_area 数据结构被访问? (http://www.tldp.org/LDP/tlk/mm/memory.html,3.4.1 页面分配部分)

最佳答案

好吧,在终于找到一个优秀的指南 (http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/) 并花了几个小时挖掘 Linux 内核之后,我找到了答案......

  • 确实,brk 只压入虚拟内存区域。
  • 当用户应用程序命中 *allocated_integer = 5; 时,发生页面错误。
  • page fault routine将search对于负责地址的虚拟内存区域然后call页表处理程序。
  • page table handler通过每个级别(x86 中的 2 个级别和 x86_64 中的 4 个级别),如果它们不存在则分配条目( 2nd , 3rd 和 4th ),最后是 calls真正的处理者。
  • real handler 实际上 calls function负责分配页面框架。

关于memory-management - 当进程访问刚用 brk/sbrk 分配的地址时,内核会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35823211/

相关文章:

haskell - 为我的编译器实现代数数据类型

c# - 如何处理内存不足异常字符串生成器

r - 使用SparkR,如何将字符串列拆分为 'n'多列?

Git - 删除或编辑别名

api - 在 POST 中将数据安全地发送到 REST API

shell - 自解压 tar 存档(shell 脚本)

ruby-on-rails - ApplicationController.rb 中如何使用设计方法

sql-server - -S 服务器时出现 sqlcmd 错误

xml - XML 文档的第一行是什么?

zsh - 复制数组 1 :1 in zsh