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

时间:2016-03-06 04:44:04

标签: memory-management linux-kernel virtual-memory

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

以下列出了我在整个谜题中所知道的事项:

  • malloc()是用户空间。 libc负责系统调用作业(调用brk / sbrk / mmap ...)。它设法获得大块内存,由虚拟地址范围描述。该库会对这些块进行切片并设法响应用户应用程序请求。
  • 我知道brk / sbrk系统调用的内容。我知道什么'程序打破'手段。这些调用基本上推动了程序中断偏移。这就是libc获取虚拟内存块的方式。
  • 现在用户应用程序有一个新的虚拟地址可供操作,它只是为它写了一些值。喜欢:*allocated_integer = 5;。好。怎么办?如果brk / sbrk仅更新流程中的偏移量'进程表中的条目,或者其他什么,物理内存的实际分配方式?
  • 我知道虚拟内存,页面表,页面错误等。但我想知道这些事情究竟是如何与我描述的这种情况有关。例如:是过程'页面表修改?怎么样?什么时候?发生页面错误?什么时候?为什么?有什么目的?这个'好友算法是什么时候?调用,并访问此free_area数据结构? (http://www.tldp.org/LDP/tlk/mm/memory.html 3.4.1页面分配部分)

1 个答案:

答案 0 :(得分:1)

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

  • 实际上,brk仅推送虚拟内存区域。
  • 当用户应用程序命中*allocated_integer = 5;时,会发生页面错误。
  • page fault routinesearch表示负责该地址的虚拟内存区域,然后是call页表处理程序。
  • page table handler遍历每个级别(x86中的2个级别和x86_64中的4个级别),如果条目不存在,则分配条目(2nd3rd和{{ 3}}),然后最后4th真正的处理程序。
  • 负责分配页面框架的calls 实际 real handler calls