当进程访问刚刚分配给 brk/sbrk 的地址时,内核会发生什么?
What happens in the kernel when the process accesses an address just allocated with brk/sbrk?
这其实是一道内存管理的理论题。由于不同的操作系统以不同的方式实现事物,我将不得不减轻对知识的渴望,只询问其中一个操作系统是如何工作的:(最好是开源和广泛使用的操作系统:Linux.
这是我在整个谜题中所知道的事情列表:
malloc()
是用户 space。 libc 负责系统调用作业(调用 brk
/sbrk
/mmap
...)。它设法获得大块内存,由虚拟地址范围描述。该库将这些块切片并设法响应用户应用程序请求。
- 我知道
brk
/sbrk
系统调用的作用。我知道 'program break' 是什么意思。这些调用基本上推动程序中断偏移量。这就是 libc 获取其虚拟内存块的方式。
- 既然用户应用程序有一个新的虚拟地址可以操作,它只需向其中写入一些值。喜欢:
*allocated_integer = 5;
。行。怎么办?如果brk
/sbrk
只更新进程在进程table中的入口偏移量,或者其他什么,物理内存实际是如何分配的?
- 我知道虚拟内存、页面 tables、页面错误等。但我想确切地知道这些事情与我描述的这种情况有何关系。例如:进程的页面 table 是否被修改?如何?什么时候?发生页面错误?什么时候?为什么?出于什么目的?这个 'buddy algorithm' 是什么时候调用的,这个
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 will search for the virtual memory area responsible for the address and then call 页面 table 处理程序。
- page table handler goes through each level (2 levels in x86 and 4 levels in x86_64), allocating entries if they're not present (2nd, 3rd and 4th), and then finally calls 真正的处理者。
- 负责分配页框的real handler actually calls the function。
这其实是一道内存管理的理论题。由于不同的操作系统以不同的方式实现事物,我将不得不减轻对知识的渴望,只询问其中一个操作系统是如何工作的:(最好是开源和广泛使用的操作系统:Linux.
这是我在整个谜题中所知道的事情列表:
malloc()
是用户 space。 libc 负责系统调用作业(调用brk
/sbrk
/mmap
...)。它设法获得大块内存,由虚拟地址范围描述。该库将这些块切片并设法响应用户应用程序请求。- 我知道
brk
/sbrk
系统调用的作用。我知道 'program break' 是什么意思。这些调用基本上推动程序中断偏移量。这就是 libc 获取其虚拟内存块的方式。 - 既然用户应用程序有一个新的虚拟地址可以操作,它只需向其中写入一些值。喜欢:
*allocated_integer = 5;
。行。怎么办?如果brk
/sbrk
只更新进程在进程table中的入口偏移量,或者其他什么,物理内存实际是如何分配的? - 我知道虚拟内存、页面 tables、页面错误等。但我想确切地知道这些事情与我描述的这种情况有何关系。例如:进程的页面 table 是否被修改?如何?什么时候?发生页面错误?什么时候?为什么?出于什么目的?这个 'buddy algorithm' 是什么时候调用的,这个
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 will search for the virtual memory area responsible for the address and then call 页面 table 处理程序。
- page table handler goes through each level (2 levels in x86 and 4 levels in x86_64), allocating entries if they're not present (2nd, 3rd and 4th), and then finally calls 真正的处理者。
- 负责分配页框的real handler actually calls the function。